天天看點

vue v-for key的原理

著作權歸作者所有。

商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

連結:http://caibaojian.com/vue2-0-rule.html

來源:http://caibaojian.com

提到v-for需要設定鍵值,許多人第一反應會從diff算法的角度去講原因,我更喜歡舉一個例子來示範一下原因

假設有這樣的一個頁面,頁面的清單是通過周遊數組得來的,如下圖所示

示例代碼如下

vue v-for key的原理

現在需要删除第二個元素。下面我們分别在渲染清單是 不使用key,使用索引作為key, 使用唯一值id作為key,看三種場景删除第二個元素之後的效果

vue v-for key的原理

可以看到,不使用key,删除第二個元素之後,輸入框前面的數字顯示正确的,但是數字3後面的輸入框的内容顯示錯了,應該顯示 我是第三個

vue v-for key的原理

可以看到,使用索引作為key之後,與不使用key的效果一樣,删除第二個元素之後,輸入框前面的數字顯示正确的,但是數字3後面的輸入框的内容顯示錯了,應該顯示 我是第三個

vue v-for key的原理

使用id作為key,顯示正确

為什麼v-for需要設定key,原因很簡單。 對比數組 [1,2,3]和[1,3],我們很容易發現删掉了2,但是計算機不是這樣的邏輯

計算機對比新舊數組,發現1===1,保持不變

然後再對比2,發現2變成了3,那麼就把2修改為3,原來第二行的元素都可以複用,隻把數字改一下就可以了

然後在對比3與undefined,發現3被删了,索引把第三行的元素删掉

那麼為什麼不能用索引作為key呢? 當删掉[1,2,3]中的2之後,數組的長度由3變成了2,那麼原來數字3的索引就變成了數字2的索引了。

1.計算機對比key為0的值,發現都是1,保持不變

2.計算機對比key為1的值,發現從2變成了3,元素複用, 修改元素上面的文字

3.計算機對比key為2的值,發現被删掉了,是以删掉第三行元素

而對于使用id作為key,那麼每條資料都有了唯一的辨別,當删掉[{id:‘1’,value: 1},{id: ‘2’,value: 2}, {id: ‘3’, value:3}]中的第二個,整個過程如下

1.計算機取出新資料第一項的id,然後在原來資料裡面尋找,發現存在相同id的資料,而且資料沒有變化,是以保持不變

2.計算機繼續取第二項的id,發現是3,然後從原來資料裡面也找到了3,是以3保留

3.這時候舊資料裡面剩了id為2的資料,而新的裡面沒有了,是以删掉。

繼續閱讀