首先不加key更快胃榕,更快盛险,更快。重要的事情說三遍勋又。
如果循環(huán)的列表苦掘,就是靜態(tài)展示,沒有添加楔壤,插入鹤啡,刪除,修改狀態(tài)等操作蹲嚣,就不用加key递瑰。
什么,開發(fā)工具報(bào)錯(cuò)隙畜?不用管它就對(duì)了抖部。
說到這個(gè)問題想必要舉個(gè)例子了
沒有key
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
<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 實(shí)例,得到 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)選中呂不為時(shí)禾蚕,添加楠楠后選中的確是李斯您朽,并不是我們想要的結(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 實(shí)例,得到 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)選中呂不為時(shí)几颜,添加楠楠后依舊選中的是呂不為倍试。
可以簡單的這樣理解:加了key(一定要具有唯一性) id的checkbox跟內(nèi)容進(jìn)行了一個(gè)關(guān)聯(lián)。是我們想達(dá)到的效果
如果key沒有唯一性蛋哭,比如key為item.name县习,那么出現(xiàn)同名的name,就會(huì)出上面的問題谆趾。
查過相關(guān)文檔躁愿,圖例說明很清晰。
vue和react的虛擬DOM的Diff算法大致相同沪蓬,其核心是基于兩個(gè)簡單的假設(shè)
首先講一下diff算法的處理方法彤钟,對(duì)操作前后的dom樹同一層的節(jié)點(diǎn)進(jìn)行對(duì)比,一層一層對(duì)比跷叉,如下圖:
當(dāng)某一層有很多相同的節(jié)點(diǎn)時(shí)逸雹,也就是列表節(jié)點(diǎn)時(shí)营搅,Diff算法的更新過程默認(rèn)情況下也是遵循以上原則。
比如一下這個(gè)情況:
我們希望可以在B和C之間加一個(gè)F梆砸,Diff算法默認(rèn)執(zhí)行起來是這樣的:
即把C更新成F转质,D更新成C,E更新成D帖世,最后再插入E休蟹,是不是很沒有效率?
所以我們需要使用key來給每個(gè)節(jié)點(diǎn)做一個(gè)唯一標(biāo)識(shí)狮暑,Diff算法就可以正確的識(shí)別此節(jié)點(diǎn)鸡挠,找到正確的位置區(qū)插入新的節(jié)點(diǎn)。
vue中列表循環(huán)需加:key="唯一標(biāo)識(shí)" 唯一標(biāo)識(shí)可以是item里面id index等搬男,因?yàn)関ue組件高度復(fù)用增加Key可以標(biāo)識(shí)組件的唯一性拣展,為了更好地區(qū)別各個(gè)組件 key的作用主要是為了高效的更新虛擬DOM
作者:Nanshannan
鏈接:http://www.reibang.com/p/4bd5e745ce95
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處缔逛。