溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

淺談VUE中演示v-for為什么要加key

發(fā)布時間:2020-09-14 20:04:01 來源:腳本之家 閱讀:123 作者:Nanshannan 欄目:web開發(fā)

說到這個問題想必要舉個例子了

沒有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 實(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)選中呂不為時,添加楠楠后選中的確是李斯,并不是我們想要的結(jié)果,我們想要的是當(dāng)添加楠楠后,一種選中的是呂不為

淺談VUE中演示v-for為什么要加key

淺談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" :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)選中呂不為時,添加楠楠后依舊選中的是呂不為。

淺談VUE中演示v-for為什么要加key

淺談VUE中演示v-for為什么要加key

可以簡單的這樣理解:加了key(一定要具有唯一性) id的checkbox跟內(nèi)容進(jìn)行了一個關(guān)聯(lián)。是我們想達(dá)到的效果

查過相關(guān)文檔,圖例說明很清晰。

vue和react的虛擬DOM的Diff算法大致相同,其核心是基于兩個簡單的假設(shè)
首先講一下diff算法的處理方法,對操作前后的dom樹同一層的節(jié)點(diǎn)進(jìn)行對比,一層一層對比,如下圖:

淺談VUE中演示v-for為什么要加key

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

比如一下這個情況:

淺談VUE中演示v-for為什么要加key

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

淺談VUE中演示v-for為什么要加key

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

淺談VUE中演示v-for為什么要加key

vue中列表循環(huán)需加:key="唯一標(biāo)識" 唯一標(biāo)識可以是item里面id index等,因?yàn)関ue組件高度復(fù)用增加Key可以標(biāo)識組件的唯一性,為了更好地區(qū)別各個組件 key的作用主要是為了高效的更新虛擬DOM

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI