說說 Vue.js 例項及資料繫結能力
1 建立例項
通過 Vue() 建構函式就可以建立一個 Vue 的根例項:
var app = new Vue({
...
});
1.1 el 選項
el 選項用於繫結頁面中的某個 DOM 元素。它可以是 HTMLElement 或是 CSS 選擇器。
在上例中:
- HTMLElement 方式為
document.getElementById('app')
。 - CSS 選擇器方式為
#app
。
建議使用 CSS 選擇器方式,因為它更簡潔。
可以通過 app.$el
來訪問這個 DOM 元素。
1.2 data 選項
data 選項用於設定需要雙向繫結的資料。建議把所有會用到的資料都放在 data 選項,這樣做便於維護。
通過 Vue 例項,我們可以U獲取 data 物件中的所有屬性物件:
html:
<div id="app"></div>
js:
var app = new Vue({
el: '#app',
data: {
content: '今天天氣不錯'
}
});
console.log("content:" + app.content);//今天天氣不錯
我們也可以在 data 選項中指向一個已定義的變數,這樣它們之間就建立了雙向繫結關係,即修改其中一個值時,另一個的值也會發生變化:
var news = { title: '火車票購票新規:換乘購票需間隔40分鐘以上' }; var app3 = new Vue({ el: '#app', data: news }); console.log('app3.title:' + app3.title);//火車票購票新規:換乘購票需間隔40分鐘以上 //修改 Vue 例項屬性 app3.title = '菜鳥驛站資料被盜'; console.log('news.title:' + news.title);//菜鳥驛站資料被盜 //修改變數屬性 news.title = '央視中秋晚會節目單公佈 吉隆坡悉尼海外分會場成亮點'; console.log('app3.title:' + app3.title);//央視中秋晚會節目單公佈 吉隆坡悉尼海外分會場成亮點
2 生命週期
建立例項時,會經歷一系列的初始化過程,同時也會呼叫相應的生命週期中的鉤子。我們可以在合適的時機,在這些鉤子中執行某些特定的業務。
常用的生命週期鉤子有這些:
鉤子 | 說明 |
---|---|
created | 例項化建立完成後呼叫,此階段完成了資料觀測,但尚未掛載, $el 還不可用,一般在此進行一些資料初始化處理工作。 |
mounted | el 掛載到例項後呼叫,一般在此編寫第一個業務邏輯 。 |
beforeDestroy | 例項被銷燬之前呼叫 。 一般在此解綁通過 addEventListener 新增的監聽事件。 |
**注意:**鉤子中的 this 指向它自身的 Vue 例項。
var app4 = new Vue({
el: '#app',
data: {
name:'deniro'
},
created:function () {
console.log(this.name);//deniro
},
mounted:function () {
console.log(this.$el);//<div id="app"></div>
}
});
3 插值與表示式
插值語法是雙大括號( Mustache 語法) “{{ }}
”,它會自動將我們雙向繫結的資料實時顯示出來。
html:
<div id="app">
{{friend}}
</div>
js:
var app = new Vue({
el: '#app',
data: {
friend: 'Jack'
}
})
雙大括號 {{friend}}
會被替換為 Jack。
只要資料被修改,那麼文字插值中的內容都會被替換。我們做一個計數器,它的值每秒會遞增 1:
html:
<div id="app2">
{{count}}
</div>
js:
var app2 = new Vue({
el: '#app2',
data: {
count: 1
},
mounted: function () {
var that = this;//設定 that 為當前 Vue 例項
//每秒遞增計數器
this.timer = setInterval(function () {
that.count++;//遞增
}, 1000);
},
beforeDestroy: function () {//銷燬前,清除定時器
if (this.timer) {
clearInterval(this.timer);
}
}
});
效果:
插值表示式還支援使用 JavaScript 表示式進行簡單的運算 、 甚至支援三元運算子。
html:
<div id="app5">
{{num*3}}
{{isTrue?'真的':'假的'}}
{{context.length}}
</div>
js:
var app5 = new Vue({
el: '#app5',
data: {
num: 3,
isTrue: true,
context: '聽輕音樂是一種享受O(∩_∩)O~'
}
});
輸出結果:
9 真的 17
注意: Vue 只支援單個表示式,不支援語句和流程控制 。 另外,在表示式中,不能使用使用者自定義的全域性變數,只能使用 Vue 內部定義全域性變數,如 Math 和 Date 等。
4 輸出 HTML 程式碼
可以使用 v-html
屬性,讓某個 HTML 元素內包裹 HTML 程式碼:
html:
<div id="app3">
<span v-html="h1"></span>
</div>
js:
var app3 = new Vue({
el: '#app3',
data: {
h1: '<h1>據說用牙刷刷貓時,貓會感覺像被媽媽舔一樣,網友試了下結果……</h1>'
}
});
**注意:**使用者輸入的內容,如果直接使用 v-html
屬性輸出 HTML 程式碼,那麼就有可能遭遇 XSS 攻擊的問題,所以服務端必須對使用者提交的內容進行過濾處理(如轉義尖括號 <>
)。
5 v-pre 屬性
可以使用 v-pre 屬性,來跳過這個元素與其子元素的編譯過程,比如希望顯示 {{}}
字串:
html:
<div id="app4">
<span v-pre>{{content}}</span>
</div>
6 過濾器
Vue.js 支援在 {{ }}
插值的尾部 · 新增一個管道符 “ |
” 實現資料過濾功能,這項能力經常用於格式化文字,比如字母全部大寫,格式化貨幣數值等 。 過濾的規則是自定義的,通過給 Vue 例項新增選項 filter 來設定,假設我們對返回的字串,設定為全部大寫:
html:
<div id="app6">
{{str | upperCaseStr}}
</div>
js:
var app6 = new Vue({
el: '#app6',
data: {
str: "deniro"
},
filters: {
upperCaseStr: function (val) {
return val.toUpperCase();
}
}
});
輸出結果:
DENIRO
**注意:**過濾選項名是 filters
,有 s 結尾的哦O(∩_∩)O~
過濾器還可以串聯起來:
{{ val | filterFuntionA | filterFuntionB | ... }}
因為過濾器是 JavaScript 函式,所以可以定義入參:
{{ val | filterFuntion(arg1,arg2,...)}}
**注意:**入參是從過濾函式的第二個引數開始的,因為第一個是 val。
過濾器適用於處理簡單的文字格式化操作,如果需要處理更為複雜的資料轉換操作,建議使用計算屬性。