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

喜歡請關注 會不定時更新 ***

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

image

沒有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>

當選中呂不為時,添加楠楠后選中的確是李斯,并不是我們想要的結果,我們想要的是當添加楠楠后,一種選中的是呂不為

key1.jpg
key3.jpg

有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>

同樣當選中呂不為時,添加楠楠后依舊選中的是呂不為。

key1.jpg
key2.jpg

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

查過相關文檔,圖例說明很清晰。

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


before.png

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


3297464-ee627869a6714336.jpg

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


3297464-d912523aac5fd108.jpg

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很沒有效率?

所以我們需要使用key來給每個節(jié)點做一個唯一標識,Diff算法就可以正確的識別此節(jié)點,找到正確的位置區(qū)插入新的節(jié)點。


3297464-650689b4bd4b9eb6.jpg

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容