Vue 的 v-if,v-show,v-for 指令
文檔警告 Warning:
由于做筆記沒有注意到 Vue 官方文檔中的提示、書寫規(guī)范,之前在 Vue 實(shí)例對象中,data 的寫法是有誤的。
從本頁文檔開始將使用通行寫法。
When defining a component, data must be declared as a function that returns the initial data object, because there will be many instances created using the same definition. If we use a plain object for data, that same object will be shared by reference across all instances created! By providing a data function, every time a new instance is
created we can call it to return a fresh copy of the initial data.
v-if 與 v-show
按照慣例,我們依然從一個(gè)需求引入我們的知識點(diǎn):
頁面上有一個(gè)按鈕,我想讓他控制某個(gè)內(nèi)容元素是否顯示,在 Vue 我該怎么做呢?
<div id="root">
<div>Hello world</div>
<button > show or hide </button>
</div>
<script>
new Vue({
el: "#root",
data() {
return {
show: true
}
},
methods: {
// ...About button action
}
})
</script>
- 我們定義了一個(gè)布爾變量,用于表示是否顯示內(nèi)容的布爾邏輯狀態(tài) 即 true or false
- v-if 指令 和 v-show 指令正需要一個(gè)這樣的布爾值,它們可以將邏輯值的真假綁定在元素上,以此決定元素是否顯示。
- 還記得我們的 button 點(diǎn)擊事件怎么寫么?
<button @click="handleClick"> </button>
<!-- 此處簡寫 Vue 實(shí)例對象中的 method 部分 -->
<script>
methods:{
handleClick: function(){
this.show = !this.show //取反
}
}
</script>
那 v-if 和 v-show 有什么區(qū)別呢 ?我們按下 F12,打開集成查看器一探究竟吧!
當(dāng)我們使用 v-if 時(shí):
<div v-if="show">Hello world</div>
<button @click="handleClick"> show or hide </button>
當(dāng)我們點(diǎn)擊按鈕后:
- 由此可見,v-if 直接改變了文檔內(nèi)容,將該元素從 DOM 中去除掉了。
而當(dāng)我們使用 v-show 時(shí):
<div v-show="show">Hello world</div>
<button @click="handleClick"> show or hide </button>
當(dāng)我們點(diǎn)擊按鈕后:
- 由此可見,v-show 是通過添加了 CSS 屬性 display: none; 來隱藏元素的。
根據(jù)情況而定:
- 如果元素?cái)?shù)量非常多時(shí),那么頻繁地操作 DOM 增刪顯然不是一個(gè)好的選擇,所以更多選擇 v-show
- 如果顯示和隱藏并不那么頻繁,那么 v-if 也是可以的。
v-for
學(xué)過一個(gè)或多個(gè)編程語言后,對 for 一定不陌生,應(yīng)該幾乎是所有的編程語言都把 for 定為了一個(gè)和循環(huán)相關(guān)的關(guān)鍵字,當(dāng)然在 Vue 中也沿用了這種標(biāo)示。
比如我有一組數(shù)據(jù)想要羅列展示,顯然手打一行一行地敲成 HTML 文檔內(nèi)容是一個(gè)非常麻煩低效的選擇。
那么學(xué)習(xí)了 Vue ,我們可以這樣做:
<div id="root">
<ul>
<li v-for="item of list"> {{ item }}</li>
</ul>
</div>
<script>
new Vue({
el: "#root",
data() {
return {
show: true,
list: ['Head title', 'Main context', 'End message']
}
}
})
</script>
語法解析:類同與 Python 的 for 循環(huán),除開 in 變成了 of 以外,仍然是 for 取出的單項(xiàng) in 項(xiàng)目總集合 的形式, 取出的單項(xiàng)是可以作為 插值表達(dá)式 中的數(shù)據(jù)使用的哦!
顯而易見,data 中對應(yīng) list 的數(shù)據(jù)總集合一定要是某種可迭代的數(shù)據(jù)集合類,比如數(shù)組、字典等。
Attention 1: 當(dāng)我們使用了 v-for ,為了盡可能地提升渲染效率,我們都應(yīng)該加上 :key 指令,:key 指令必須和一個(gè)永不重復(fù)的值綁定,一般不使用 item,因?yàn)?item 很可能重復(fù)。
-
Attention 2:大多數(shù)情況下會(huì)使用循環(huán)次數(shù)下標(biāo),寫成:
<div v-for="(item, index) of list" :key="index"> {{ item }} </div>
但這并不是最終的完美選擇,但是當(dāng)需要做排序等這類頻繁改變列表元素位置的操作時(shí),index 作為 key 值會(huì)被打亂。
思考題: 那么請問這個(gè)最終解決方案應(yīng)該是什么呢?