Vue 學習筆記(二)


1券坞、Vue實例與數(shù)據(jù)綁定

1.1 實例與數(shù)據(jù)

Vue.js應用的創(chuàng)建很簡單,通過構(gòu)造函數(shù)Vue就可以創(chuàng)建一個Vue的根實例肺素,并啟動Vue應用:

var app = new Vue({
    // 選項
});

變量app就代表了這個實例恨锚。
首先,必不可少的一個選項就是el倍靡。el用于指定一個頁面中已存在的DOM元素來掛載Vue實例猴伶。

<div id="app">{{ name }}</div>
var app = new Vue({
    el: document.getElementById('app'), // 或者 ‘#app’
    data :{
        name: 'Hello World'
    }
});

其次,通過Vue實例的data選項塌西,可以聲明應用內(nèi)需要雙向綁定的數(shù)據(jù)他挎。建議所有會用到得數(shù)據(jù)都預先在data內(nèi)聲明,這樣不至于將數(shù)據(jù)散落在業(yè)務邏輯中捡需,難以維護办桨。
除了顯示得聲明數(shù)據(jù)外,也可以指向已有得變量站辉,并且它們之間默認建立了雙向綁定呢撞,當修改其中任意一項時,另一個也會一起變化饰剥,即匹配更新為新的值殊霞。

var myData = {
    a:1
};
var app = new Vue({
    el: ‘#app’,
    data: myData
});
console.log(app.a); // 1
// 修改屬性,原數(shù)據(jù)也會隨之改變
app.a = 2;
console.log(myData.a); // 2
// 反之汰蓉,修改原數(shù)據(jù)脓鹃,Vue屬性也會改變
myData.a = 3;
console.log(app.a); // 3

1.2 Vue生命周期

每個Vue實例創(chuàng)建時,都會經(jīng)歷一系列得初始化過程古沥,同時也會調(diào)用相應的生命周期鉤子,我們可以利用這些鉤子娇跟,在合適的時機執(zhí)行我們的業(yè)務邏輯岩齿。例如jQuery的ready()方法。

$(document).ready(function(){
    // DOM加載完成后苞俘,會執(zhí)行這里得代碼
});

Vue的生命周期與之類似

vue生命周期圖
Vue2.0 Description
beforeCreate 組件實例剛被創(chuàng)建盹沈,組件屬性計算之前,如data屬性等
created 組件實例創(chuàng)建完成吃谣,屬性已綁定乞封,但DOM還未生成,$el 屬性還不存在,需要初始化處理一些數(shù)據(jù)時會比較有用岗憋。
beforeMount 模版編譯/掛載之前
mounted 模版編譯/掛載之后肃晚,一般我們的第一個業(yè)務邏輯會在這里開始。
beforUpdate 組件更新之前
updated 組件更新之后
activated for keep-alive,組件被激活時調(diào)用
deactivated for keep-alive,組件被移除時調(diào)用
beforeDestory 組件銷毀前調(diào)用仔戈,主要解綁一些使用addEventListener監(jiān)聽的事件等关串。
destroyed 組件銷毀后調(diào)用

1.3 插值與表達式

文本
數(shù)據(jù)綁定最常見的形式就是使用“Mustache”語法 (雙大括號) 的文本插值:

<span>Message: {{ msg }}</span>

Mustache 標簽將會被替代為對應數(shù)據(jù)對象上msg屬性的值拧廊。無論何時,綁定的數(shù)據(jù)對象上 msg 屬性發(fā)生了改變晋修,插值處的內(nèi)容都會更新吧碾。

原始 HTML
雙大括號會將數(shù)據(jù)解釋為普通文本,而非HTML代碼墓卦。為了輸出真正的 HTML倦春,你需要使用 v-html 指令:

<p>Using v-html directive: <span v-html="rawHtml"></span></p>

這里需要注意,如果將用戶產(chǎn)生得內(nèi)容使用v-html輸出后落剪,有可能導致XSS攻擊睁本,所以要在服務端對用戶提交得內(nèi)容進行處理,一般可將尖括號“<>”轉(zhuǎn)義著榴。

v-pre
如果想顯示{{}}標簽添履,而不進行替換,使用v-pre即可跳過這個元素和它子元素得編譯過程脑又。

<span>{{ 這里的內(nèi)容是不會被編譯的 }}</span>

特性
Mustache 語法不能作用在 HTML 特性上暮胧,遇到這種情況應該使用 v-bind 指令:

<div v-bind:id="dynamicId"></div>

使用 JavaScript 表達式
對于所有的數(shù)據(jù)綁定,Vue.js 都提供了完全的 JavaScript 表達式支持

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>

Vue.js只支持單個表達式问麸,不支持語句和流控制往衷。另外在表達式中,不能使用用戶自定義的全局變量严卖,只能使用Vue白名單內(nèi)的全局變量席舍,例如Math和Date。以下是一些無效得示例:

<!-- 這是語句哮笆,不是表達式-->
{{ let name = "hello world" }}
<!-- 不能使用流控制来颤,要使用三元運算 -->
{{ if (ok) { return msg } }}

2、指令與事件

指令 (Directives) 是帶有 v- 前綴的特殊特性稠肘。指令特性的值預期是單個 JavaScript 表達式 (v-for是例外情況)福铅。指令的職責是,當表達式的值改變時项阴,將其產(chǎn)生的連帶影響滑黔,響應式地作用于DOM

2.1 參數(shù)

v-bind 一些指令能夠接收一個“參數(shù)”环揽,在指令名稱之后以冒號表示略荡。例如,v-bind 指令可以用于響應式地更新 HTML 特性歉胶,比如id,class等汛兜。

<div id="app">
    <a v-bind:href="url">鏈接</a>
    <img v-bind:src="imgUrl">
</div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
            url: "https://www.github.com",
            imgUrl: "http://xxx.xxx.xx/img.png"
        }
    });
</script>

示例中的鏈接地址與圖片得地址都與數(shù)據(jù)進行了綁定,當通過各種方式改變數(shù)據(jù)時跨扮,鏈接和圖片都會自動更新序无。

v-on另一個例子是 v-on 指令验毡,它用于監(jiān)聽 DOM 事件:

<div id="app">
    <p v-if="isShow">看見還是看不見?</p>
    <button v-on:click="handleClose">點擊隱藏</button>
</div>
<script>
    var app = new Vue({
       el:'#app',
       data:{
           isShow:true
       },
       methods:{
           handleClose(){
               this.isShow = false;
           }
       }
    });
</script>

在button 按鈕上使用v-on:click給元素綁定一個點擊事件帝嗡,在普通元素上晶通,v-on可以監(jiān)聽原生DOM事件。除click外哟玷,還有dblclick狮辽、keyup、mousemove等巢寡。表達式可以是一個方法名喉脖,這些方法都寫在Vue實例得methods屬性內(nèi),并且是函數(shù)的形式抑月,函數(shù)內(nèi)this指向的當前Vue實例本身树叽,因此可以直接使用this.xxx的形式來訪問或修改數(shù)據(jù)。
表達式除了方法外谦絮,也可以直接是一個內(nèi)聯(lián)語句题诵,上例也可以改為:

<div id="app">
    <p v-if="isShow">看見還是看不見?</p>
    <button v-on:click="show = false">點擊隱藏</button>
</div>
<script>
    var app = new Vue({
       el:'#app',
       data:{
           isShow:true
       }
    });
</script>

這種場景只適用于簡單得業(yè)務邏輯层皱,如果綁定的事件要處理復雜得業(yè)務邏輯性锭,建議還是在mothods里聲明一個方法,這樣可讀性更強也利于維護叫胖。

2.2 語法糖

語法糖是指在不影響功能得情況下草冈,添加某種方法實現(xiàn)同樣得效果,從而方便程序開發(fā)瓮增。
Vue.js的v-bind和v-on都提供了語法糖怎棱,也可以說是縮寫,
v-bind绷跑,可以直接省略v-bind蹄殃,直接寫一個冒號“:”:

<a v-bind:href="url">鏈接</a>
<img v-bind:src="imgUrl">
<!-- 縮寫為 -->
<a :href="url">
<img :src="imgUrl">

v-on可以直接用“@”來縮寫:

<button v-on:click="handleClose">點擊隱藏</button>
<!-- 縮寫為 -->
<button @click="handleClose">點擊隱藏</button>

3、class與style綁定

3.1 綁定class的幾種方法

1. 對象語法

給v-bind:class設置一個對象你踩,可以動態(tài)的切換class,例如:

<div id="app">
    <div :class="{ 'active': isActive }"></div>
</div>
<script>
    var app = new Vue({
       el: '#app',
       data:{
           isActive: true
       } 
    });

上面示例中,類名active依賴與數(shù)據(jù)isActive,當其為true時讳苦,div會擁有類名active,為false時則沒有带膜,所以上面示例的最終渲染結(jié)果為:

<div class="active"></div>

當:class的表達式過長或邏輯復雜時,還可以綁定一個計算屬性鸳谜,這是一種很友好很常見的方法膝藕,一般當條件多于兩個時,都可以使用data或者computed,例如使用計算屬性:

<div id="app">
    <div :class="classes"></div> 
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            isActive: true,
            error: null
        },
        computed:{
            classes(){
                return {
                    active: this.isActive && !this.error,
                    'text-fail': this.error && this.error.type==='fail'
                };
            }
        }
    });
</script>

除了計算屬性咐扭,你也可以直接綁定一個object類型的數(shù)據(jù)芭挽,或者使用類似計算屬性的mothods滑废。

2. 數(shù)組語法

當需要多個class時,可以直接使用數(shù)組語法袜爪,給:class 綁定一個數(shù)組蠕趁,應用一個class列表:

<div id="app">
    <div :class="[activeCls,errorCls]"></div>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            activeCls: 'active',
            errorCls: 'error'
        }
    });
</script>

渲染的結(jié)果為:

<div class="active,error"></div>

也可使用三元運算表達式來根據(jù)條件切換class,例如下面的例子:

<div id="app">
    <div :class="[isActive ? activeCls : '',errorCls]"></div>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            isActive: true,
            activeCls: 'active',
            errorCls: 'error'
        }
    });
</script>

與數(shù)組語法一樣,也可以使用data,computed和methods三種方法辛馆。

3.2 綁定內(nèi)聯(lián)樣式
使用v-bind:style(即:style)可以給元素綁定內(nèi)聯(lián)樣式俺陋,方法與:class類似,也有對象語法和數(shù)組語法昙篙,看起來就像直接在元素上寫css:

<div id="app">
    <div :style="{'color':color, 'fontSize':fontSize + 'px' }">文本</div>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            color: red,
            fontSize: 14,
        }
    });
</script>

css屬性名稱使用駝峰命名(camelCase)或者短橫線分割命名(kebab-case),渲染后的結(jié)果為:

<div style="color:red;font-size:14px;">文本</div>

大多數(shù)情況下腊状,直接寫一長串的樣式不便于閱讀和維護,所以一般寫在data或computed里苔可,以data為例:

    <div id="app">
    <div :style="styles">文本</div>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            styles: {
                color: 'red',
                fontSize: 14 + 'px',
            }
        }
    });
</script>

應用多個樣式時缴挖,可以使用數(shù)組語法:

<div :style=[styleA,styleB]>文本</div>

在實際業(yè)務中,:style的數(shù)組語法不常用焚辅,因為往往可以寫在一個對象里面映屋;而較為常用的應當是計算屬性。
另外法焰,使用:style時秧荆,Vue.js會自動給特殊的css屬性名稱增加前綴,比如transform埃仪。

參考資料-Vue.js
參考資料-Vue.js實戰(zhàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乙濒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卵蛉,更是在濱河造成了極大的恐慌颁股,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傻丝,死亡現(xiàn)場離奇詭異甘有,居然都是意外死亡,警方通過查閱死者的電腦和手機葡缰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門亏掀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泛释,你說我怎么就攤上這事滤愕。” “怎么了怜校?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵间影,是天一觀的道長。 經(jīng)常有香客問我茄茁,道長魂贬,這世上最難降的妖魔是什么巩割? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮付燥,結(jié)果婚禮上宣谈,老公的妹妹穿的比我還像新娘。我一直安慰自己机蔗,他們只是感情好蒲祈,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萝嘁,像睡著了一般梆掸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牙言,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天酸钦,我揣著相機與錄音,去河邊找鬼咱枉。 笑死卑硫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蚕断。 我是一名探鬼主播欢伏,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亿乳!你這毒婦竟也來了硝拧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤葛假,失蹤者是張志新(化名)和其女友劉穎障陶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聊训,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抱究,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了带斑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓寺。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勋磕,靈堂內(nèi)的尸體忽然破棺而出侄刽,到底是詐尸還是另有隱情,我是刑警寧澤朋凉,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站醋安,受9級特大地震影響杂彭,放射性物質(zhì)發(fā)生泄漏墓毒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一亲怠、第九天 我趴在偏房一處隱蔽的房頂上張望所计。 院中可真熱鬧,春花似錦团秽、人聲如沸主胧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踪栋。三九已至,卻和暖如春图毕,著一層夾襖步出監(jiān)牢的瞬間夷都,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工予颤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囤官,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓蛤虐,卻偏偏與公主長得像党饮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驳庭,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一刑顺、vue生命周期 vue實例從創(chuàng)建到銷毀的過程,稱為生命周期嚷掠,共有八個階段捏检。 這八個階段里分別有一個叫做鉤子函數(shù)...
    間陽幕賓閱讀 408評論 0 1
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨立版本,Vue即被注冊為全局變量不皆,可以在頁面使用了贯城。 如果希望搭建...
    Awey閱讀 10,999評論 4 129
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容霹娄。關于...
    云之外閱讀 5,046評論 0 29
  • vue概述 在官方文檔中能犯,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,191評論 0 25