v-for與key
- 寫在前面
- 例子
- 在最后一條資料后再加一條資料
- 在中間插入一條資料
- 資料變化如下
- 虛擬DOM的Diff演算法
- 總而言之
寫在前面
使用v-for更新已渲染的元素串列時,默認用就地復用策略;串列資料修改的時候,它會根據key值去判斷某個值是否修改,如果修改,則重新渲染這一項,否則復用之前的元素;
我們在使用的時候經常會用index來作為key,但其實這不是一個好習慣,面試這樣說直接掛,講真,
例子
const list = [
{
id: 1,
name: 'test1',
},
{
id: 2,
name: 'test2',
},
{
id: 3,
name: 'test3',
},
]
上面這種是我們做專案中常用到的一種場景,因為不加key,vue現在直接報錯,所以我使用index作為key;下面列舉兩種常見的資料更新情況:
在最后一條資料后再加一條資料
const list = [
{
id: 1,
name: 'test1',
},
{
id: 2,
name: 'test2',
},
{
id: 3,
name: 'test3',
},
{
id: 4,
name: '我是在最后添加的一條資料',
},
]
此時前三條資料直接復用之前的,新渲染最后一條資料,此時用index作為key,沒有任何問題;
在中間插入一條資料
const list = [
{
id: 1,
name: 'test1',
},
{
id: 4,
name: '我是插隊的那條資料',
}
{
id: 2,
name: 'test2',
},
{
id: 3,
name: 'test3',
},
]
資料變化如下
key: 0 index: 0 name: test1 key: 0 index: 0 name: test1
key: 1 index: 1 name: test2 key: 1 index: 1 name: 我是插隊的那條資料
key: 2 index: 2 name: test3 key: 2 index: 2 name: test2
key: 3 index: 3 name: test3
通過對比,發現除了第一個資料可以復用之前的之外,另外三條資料都需要重新渲染
最好的辦法是使用陣列中不會變化的那一項作為key值,對應到專案中,即每條資料都有一個唯一的id,來標識這條資料的唯一性;使用id作為key值,我們再來對比一下向中間插入一條資料,此時會怎么去渲染
虛擬DOM的Diff演算法
vue和react的虛擬DOM的Diff演算法大致相同,其核心是基于兩個簡單的假設:

兩個相同的組件產生類似的DOM結構,不同的組件產生不同的DOM結構,
同一層級的一組節點,他們可以通過唯一的id進行區分,基于以上這兩點假設,使得虛擬DOM的Diff演算法的復雜度從O(n^3)降到了O(n),
所以我們需要使用key來給每個節點做一個唯一標識,Diff演算法就可以正確的識別此節點,找到正確的位置區插入新的節點,

總而言之
key的作用主要是為了高效地更新虛擬DOM,另外vue中在使用相同標簽名元素地過渡切換時,也會使用到key屬性,其目的也是為了讓vue可以區分它們,否則vue只會替換其內部屬性而不會觸發過渡效果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/319809.html
標籤:其他
