淺談VUE中演示v-for為什么要加key
說到這個問題想必要舉個例子了
沒有key
<div id="app">
<div>
<input type="text" v-model="name">
<button @click="add">添加</button>
</div>
<ul>
<li v-for="(item, i) in list">
<input type="checkbox"> {{item.name}}
</li>
</ul>
<script>
// 創(chuàng)建 Vue 實例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
name: '',
newId: 3,
list: [
{ id: 1, name: '李斯' },
{ id: 2, name: '呂不韋' },
{ id: 3, name: '嬴政' }
]
},
methods: {
add() {
//注意這里是unshift
this.list.unshift({ id: ++this.newId, name: this.name })
this.name = ''
}
}
});
</script>
</div>
當(dāng)選中呂不為時,添加楠楠后選中的確是李斯,并不是我們想要的結(jié)果,我們想要的是當(dāng)添加楠楠后,一種選中的是呂不為


有key
<div id="app">
<div>
<input type="text" v-model="name">
<button @click="add">添加</button>
</div>
<ul>
<li v-for="(item, i) in list" :key="item.id">
<input type="checkbox"> {{item.name}}
</li>
</ul>
<script>
// 創(chuàng)建 Vue 實例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
name: '',
newId: 3,
list: [
{ id: 1, name: '李斯' },
{ id: 2, name: '呂不韋' },
{ id: 3, name: '嬴政' }
]
},
methods: {
add() {
//注意這里是unshift
this.list.unshift({ id: ++this.newId, name: this.name })
this.name = ''
}
}
});
</script>
</div>
同樣當(dāng)選中呂不為時,添加楠楠后依舊選中的是呂不為。


可以簡單的這樣理解:加了key(一定要具有唯一性) id的checkbox跟內(nèi)容進行了一個關(guān)聯(lián)。是我們想達到的效果
查過相關(guān)文檔,圖例說明很清晰。
vue和react的虛擬DOM的Diff算法大致相同,其核心是基于兩個簡單的假設(shè)
首先講一下diff算法的處理方法,對操作前后的dom樹同一層的節(jié)點進行對比,一層一層對比,如下圖:

當(dāng)某一層有很多相同的節(jié)點時,也就是列表節(jié)點時,Diff算法的更新過程默認(rèn)情況下也是遵循以上原則。
比如一下這個情況:

我們希望可以在B和C之間加一個F,Diff算法默認(rèn)執(zhí)行起來是這樣的:

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很沒有效率?
所以我們需要使用key來給每個節(jié)點做一個唯一標(biāo)識,Diff算法就可以正確的識別此節(jié)點,找到正確的位置區(qū)插入新的節(jié)點。

vue中列表循環(huán)需加:key="唯一標(biāo)識" 唯一標(biāo)識可以是item里面id index等,因為vue組件高度復(fù)用增加Key可以標(biāo)識組件的唯一性,為了更好地區(qū)別各個組件 key的作用主要是為了高效的更新虛擬DOM
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue Element前端應(yīng)用開發(fā)之組織機構(gòu)和角色管理
本篇文章繼續(xù)深化Vue Element權(quán)限管理模塊管理的內(nèi)容,介紹組織機構(gòu)和角色管理模塊的處理,使得我們了解界面組件化模塊的開發(fā)思路和做法,提高我們界面設(shè)計的技巧,并減少代碼的復(fù)雜性,提高界面代碼的可讀性,同時也是利用組件的復(fù)用管理。2021-05-05
應(yīng)用provide與inject刷新Vue頁面方法
這篇文章主要介紹了應(yīng)用provide與inject刷新Vue頁面的兩種方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,多多進步,祝大家早日升職加薪2021-09-09

