key 是為 Vue 中 vnode 的唯一標記,通過這個 key,我們的 diff 操作可以更准確、更快速。Vue 的 diff 過程可以概括為:oldCh 和 newCh 各有兩個頭尾的變量 oldStartIndex、oldEndIndex 和 newStartIndex、newEndIndex,它們會新節點和舊節點會進行兩兩對比,即一共有4種比較方式:newStartIndex 和oldStartIndex 、newEndIndex 和 oldEndIndex 、newStartIndex 和 oldEndIndex 、newEndIndex 和 oldStartIndex,如果以上 4 種比較都沒匹配,如果設置了key,就會用 key 再進行比較,在比較的過程中,遍歷會往中間靠,一旦 StartIdx > EndIdx 表明 oldCh 和 newCh 至少有一個已經遍歷完了,就會結束比較。
所以 Vue 中 key 的作用是:key 是為 Vue 中 vnode 的唯一標記,通過這個 key,我們的 diff 操作可以更准確、更快速
更准確:因為帶 key 就不是就地復用了,在 sameNode 函數 a.key === b.key
對比中可以避免就地復用的情況。所以會更加准確。
更快速:利用 key 的唯一性生成 map 對象來獲取對應節點,比遍歷方式更快。
key的作用主要是為了高效的更新虛擬DOM。另外vue中在使用相同標簽名元素的過渡切換時,也會使用到key屬性,其目的也是為了讓vue可以區分它們。
不建議用index作為key使用
-
- 一般情況下,只是展示list,沒有太大問題
- list會動態變化刪除、添加、排序等操作,就會出現錯亂
小伙伴可以去官網看一下 https://cn.vuejs.org/v2/api/#
以上就是我在網上查閱的key的作用,還有的大佬們的博客寫的詳細的diff算法內容。