指令( Directives )是 Vue 模板中最常用的一項功能,它帶有前綴 v-,能幫我們快速完成DOM操作,循環(huán)渲染,顯示和隱藏。
基本指令
v-text
v-text 解析文本,更新元素的 textContent 。
用 {{}} 在 HTML中輸出 data的值時, 有一個問題: 當網(wǎng)速慢或者JavaScript出錯時,會暴露 {{xxx}},而 v-text 可以避免這個問題
<span v-text="msg"></span>
v-html
v-html 解析 html , 更新元素的 innerHTML。
<div v-html="htmlStr"></div>
v-bind
v-bind通常用來動態(tài)綁定屬性的,格式是v-bind:屬性名 = "值",簡寫:屬性名 = "值"
<div v-bind:class="className">v-bind綁定 class</div>
v-bind 可以縮寫為 : ,所以上面的也可以寫作:
<div :class="className">v-bind綁定 class</div>
v-bind 應用
綁定 class
1. 變量語法
v-bind:class = "變量"
這里的變量的值,通常是在css定義好的類名
2. 對象語法
v-bind:class = {classname1:boolean,classname2:boolean}
對象的鍵是類名,值是布爾值。
- 這里的classname1,classname2其實就是樣式表中的類名
- 這里的boolean通常是一個變量,也可以是常量、計算屬性等,這種方法也是綁定class最常用的方式。
當 class 的表達式過長或邏輯復雜時,可以綁定一個計算屬性,這是一種很友好和常見的用法 : demo
3. 數(shù)組語法
把一個數(shù)組傳給 v-bind:class,以應用一個 class 列表,在數(shù)組語法中也可以使用對象語法: demo
綁定內聯(lián)樣式
v-on
v-on 用來綁定事件監(jiān)聽器, 它的縮寫是 @
<div id="app">
<span>{{count}}</span>
<button v-on:click="add">add</button>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
count: 0
},
methods: {
// 方法寫在 Vue 實例的 methods 屬性內,并且是函數(shù)形式
add() {
this.count++;
// 函數(shù)內的 this 指向的是當前 Vue 實例本身,因此可以直接使用 this.xxx 的形式來訪問或修改數(shù)據(jù)
}
}
});
</script>
v-- cloak
v-- cloak 在 Vue 渲染完指定的整個DOM后才進行顯示, 一般與display:none進行結合使用,解決初始化慢導致的頁面閃動問題。
[v-cloak] {
display: none;
}
<div v-cloak>
{{ message }}
</div>
v--once
只渲染元素和組件一次。
渲染完成后,元素/組件及其所有子節(jié)點將被視為靜態(tài)內容并跳過,可以用于優(yōu)化更新性能。
<div id="app">
<p>這里沒有使用 v-once :{{onceData}}</p>
<p v-once>這里使用了 v-once :{{onceData}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
onceData: '12344'
}
})
</script>
在控制臺輸入app.onceData = 90看看會發(fā)生什么~~
條件渲染指令
v--if, v--else--if ,v--else
<div v-if="type === 'name'">
用戶名:
<input type="text" placeholder="請輸入用戶名">
</div>
<div v-else>
密碼:
<input type="text" placeholder="請輸入密碼">
</div>
<button v-on:click="changeType">點擊切換</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
type: 'name'
},
methods: {
changeType: function () {
this.type = (this.type === 'name' ? 'password' : 'name')
}
}
})
</script>
v-if 的弊端
在上面的例子中,在輸入框中輸入任何值,點擊切換后,發(fā)現(xiàn)我們輸入的值仍在.....
這是因為: Vue 在渲染元素時 ,出于效率考慮,會盡可能地復用已有的元素而非重新渲染, 因此會出現(xiàn)烏龍,只會渲染變化的元素,也就是說,input元素被復用了(僅僅是替換了它的 placeholder)。
針對 v-if 的弊端的解決辦法 --- 用 key 管理可復用的元素
Vue 提供了一種方式來表達“這兩個元素是完全獨立的,不要復用它們”。只需添加一個具有唯一值的 key 屬性即可。
<div v-if="type === 'name'">
用戶名:
<input type="text" placeholder="請輸入用戶名" key= "name">
<!-- 加上唯一的key值 -->
</div>
<div v-else>
密碼:
<input type="text" placeholder="請輸入密碼" key = "password">
<!-- 加上唯一的key值 -->
</div>
<button v-on:click="changeType">點擊切換</button>
v--show
v-show 實際上是改變display 屬性,帶有 v-show 的元素始終會被渲染并保留在 DOM 中。
<div id="app">
<p v-show="visible">v-show 實際上只是簡單地切換元素的 CSS 屬性 display</p>
<button @click= "changeView">點擊切換</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
visible: true
},
methods: {
changeView: function() {
this.visible = !this.visible
}
}
})
</script>
v-if 和v-show 比較
- v-if 有更高的切換開銷 —— 判斷是否加載DOM,需要就渲染,不需要時移除)
- v-show有更高的初始渲染開銷 —— 始終保留在DOM中,切換CSS display
列表渲染指令v--for
當需要將一個數(shù)組遍歷或枚舉一個對象屬性的時候循環(huán)顯示時,就會用到列表渲染指令 v--for。
用法: v-for 寫在要遍歷的元素上,類似于下面這樣:
<li v-for="item in items">
{{ item.message }}
</li>
當 v-if 和 v-for一起使用時。v-for 比 v-if 優(yōu)先級更高
遍歷一個數(shù)組
參數(shù): item 、index(可選)
<div id="app">
<ul>
<li v-for="(item,index) in myBooks"> {{index}} -- {{item.bookname}} -- {{item.author}}</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
myBooks: [
{bookname: '長腿叔叔',author:'簡·韋伯斯特'},
{bookname: '我們仨',author:'楊絳'},
{bookname: '島上書店',author:'美)加布瑞埃拉·澤文'}
]
}
})
</script>
遍歷一個對象
參數(shù): value、 key(可選) 、index(可選)
注意: 順序不可改變 ,必須是 value,key,index 這樣的順序
<div id="app">
<ul>
<li v-for="(value,key,index) in obj">
{{index}} - {{key}} - {{value}}
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
obj: {
book: '如何閱讀一本書',
learning: 'vue'
}
}
})
</script>