第 1 題:(滴滴、餓了麼)寫 React / Vue 項目時爲什麼要在列表組件中寫 key,其作用是什麼?

key能提高diff效率其實是不準確的。

然後,官網推薦的使用key,應該理解爲“使用唯一id作爲key”。因爲index作爲key,和不帶key的效果是一樣的。index作爲key時,每個列表項的index在變更前後也是一樣的,都是直接判斷爲sameVnode然後節點複用。

說到底,key的作用就是更新組件時判斷兩個節點是否相同。相同就複用,不相同就刪除舊的創建新的。

正是因爲帶唯一key時,如果新舊節點key不一樣,不但要銷燬和創建vnode,在DOM裏添加移除節點對性能的影響更大。所以會才說“不帶key可能性能更好”。看下面這個實驗,渲染10w列表項,帶唯一key與不帶key的時間對比:

不使用key的情況:

<li v-for="item in list">{{ item.text }}</li>

使用id作爲key的情況:

因爲不帶key時節點能夠複用,省去了銷燬/創建組件的開銷,同時只需要修改DOM文本內容而不是移除/添加節點,這就是文檔中所說的“刻意依賴默認行爲以獲取性能上的提升”。

既然如此,爲什麼還要建議帶key呢?因爲這種模式只適用於渲染簡單的無狀態組件。對於大多數場景來說,列表組件都有自己的狀態。

舉個例子:一個新聞列表,可點擊列表項來將其標記爲"已訪問",可通過tab切換“娛樂新聞”或是“社會新聞”。

不帶key屬性的情況下,在“娛樂新聞”下選中第二項然後切換到“社會新聞”,"社會新聞"裏的第二項也會是被選中的狀態,因爲這裏複用了組件,保留了之前的狀態。要解決這個問題,可以爲列表項帶上新聞id作爲唯一key,那麼每次渲染列表時都會完全替換所有組件,使其擁有正確狀態。

這只是個簡單的例子,實際應用會更復雜。帶上唯一key雖然會增加開銷,但是對於用戶來說基本感受不到差距,而且能保證組件狀態正確,這應該就是爲什麼推薦使用唯一id作爲key的原因。

key補充內容

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章