淺談VUE中演示v-for為什麼要加key
阿新 • • 發佈:2020-01-18
說到這個問題想必要舉個例子了
沒有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> // 建立 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>
當選中呂不為時,新增楠楠後選中的確是李斯,並不是我們想要的結果,我們想要的是當新增楠楠後,一種選中的是呂不為
有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> // 建立 Vue 例項,得到 ViewModel var vm = new Vue({ el: '#app',name: this.name }) this.name = '' } } }); </script> </div>
同樣當選中呂不為時,新增楠楠後依舊選中的是呂不為。
可以簡單的這樣理解:加了key(一定要具有唯一性) id的checkbox跟內容進行了一個關聯。是我們想達到的效果
查過相關文件,圖例說明很清晰。
vue和react的虛擬DOM的Diff演算法大致相同,其核心是基於兩個簡單的假設
首先講一下diff演算法的處理方法,對操作前後的dom樹同一層的節點進行對比,一層一層對比,如下圖:
當某一層有很多相同的節點時,也就是列表節點時,Diff演算法的更新過程預設情況下也是遵循以上原則。
比如一下這個情況:
我們希望可以在B和C之間加一個F,Diff演算法預設執行起來是這樣的:
即把C更新成F,D更新成C,E更新成D,最後再插入E,是不是很沒有效率?
vue中列表迴圈需加:key="唯一標識" 唯一標識可以是item裡面id index等,因為vue元件高度複用增加Key可以標識元件的唯一性,為了更好地區別各個元件 key的作用主要是為了高效的更新虛擬DOM
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。