為什麼應該在 v for 中使用 key?

2022-07-09 02:24:08 字數 1757 閱讀 9186

引用 vue 官方文件的原話:

vue 會盡可能高效地渲染元素,通常會復用已有元素而不是從頭開始渲染。

這樣容易導致一些問題。因為類似 , , 這樣的元素都有乙個internal state 儲存著元素的值,而在元素復用時,這個值是會得到保留的。

我們來看乙個登陸方式切換的例子:

v-if="isuser">

login with accountlabel>

div>

login with emaillabel>

div>

click to togglebutton>

我們會發現,在點選按鈕切換登入方式的時候,輸入框中已有的內容不會被清除,這是因為input 的 internal state 保留著元素的值。

如果我們希望切換的時候不保留這個值呢?我們可以給兩個 input 新增不同的 :key 。因為 vue 是將 key 作為唯一標識從而來識別復用的元素的,如果兩個元素的 key 不同,那麼就相當於告訴 vue「這兩個元素是完全獨立的,不要復用它們」。

同樣的,使用 v-for 更新已渲染的元素列表時,預設用 就地復用 策略。列表資料修改的時候,vue 會根據 key 去判斷某個值是否修改 —— 如果修改,則重新渲染這一項,否則復用之前的元素。在 v-for 中使用 key 是乙個最佳實踐,但是我們需要注意使用的是什麼 key 。

假如我們想要在如下陣列 [a,b,c,d,e] 的 b 和 c 之間插入 f:

index id array.elem

0 1 a

1 2 b

2 3 c

3 4 d

4 5 e

如果是使用 index 作為 key :

如果是使用 id 作為 key :

資源搜尋**大全

下面大致從虛擬dom的diff演算法實現的角度去解釋一下。

vue 和 react的虛擬 dom 的 diff 演算法大致相同,其核心是基於兩個簡單的假設:

引用 react』s diff algorithm 中的例子:

當某一層有很多相同的節點時,也就是列表節點時,diff 演算法的更新過程預設情況下也是遵循以上原則。 比如一下這個情況:

我們希望可以在 b 和 c 之間加乙個 f,diff 演算法預設執行起來是這樣的:

即把 c 更新成 f,d 更新成 c,e 更新成 d,最後再插入 e,這樣顯然很沒有效率。

所以我們需要使用 key 來給每個節點做乙個唯一標識,diff 演算法就可以正確的識別此節點,找到正確的位置區插入新的節點。

所以 key 的作用主要是為了高效的更新虛擬 dom。

譯 我們應該在何時使用 Redux

redux是乙個專注於應用狀態管理的庫,它是react應用程式中使用的常用的乙個工具庫。過早優化是萬惡之源。唐納德 克努特 這是我們在構建程式是乙個準則,這也是為什麼我們一開始在構建最新的react應用程式時,我們選擇使用react本地元件狀態開始管理我們的應用程式狀態。新的 react 應用程式前...

應該在Linux上使用的10種雲解決方案

不久前,為使用者提供一種備份遠端機器上資料的簡易方法還很稀奇。現在,我們已覺得這理所當然。dropbox及其他公司簡化了這項任務。蘋果 谷歌和微軟都提供各自的資料備份方法。在linux上,情況有點不一樣。發行版並不提供各自的雲服務來管理你的資料 不過ubuntu過去擁有ubuntu one 一些主流...

為什麼您應該使用 python m pip

首先,python m pip會使用您指定為python的python直譯器來執行pip。因此,usr bin python3.7 m pip表示您正在執行位於 usr bin python3.7的直譯器的pip。如果您不熟悉這個標誌以及它是如何工作的,您可以閱讀有關 m的文件 它非常方便 所以您可...