為什麼react列表要加key

2021-10-22 18:43:20 字數 1040 閱讀 6976

遍歷物件的每乙個屬性深度對比是非常浪費效能的

react 使用列表的key來進行對比,如果不指定,就預設為 index 下標

那麼,為什麼 不指定 key/用 index 下標 是不好的呢?

假設現在有這樣一段**:

const users = [, ];

users.map((u, i) =>

);

它會渲染出這個 dom 樹:

bob

sue

然後使用者做了某個操作,usersunshift另乙個物件,變成:

const users = [

, ,

,];

dom 樹就會變成這樣,注意key的變化:

new-guy

bobsue

dom 樹的前後對比是這樣的:

bob

| new-guy

sue | bob

| sue

我們人類看得出來前後的變化只是在開頭加了乙個new-guy而已

但是由於 react 使用 key 值來識別變化,所以 react 認為的變化是:

bob -> new-guy

sue -> bob

新增 sue

非常消耗效能 ?

但是如果我們一開始就給它指定乙個合適的 key,比如用 name:

users.map((u, i) => 

);

react 認為的變化就變成:

|  new-guy

bob | bob

sue | sue

這樣只需要做乙個unshift操作,效能節省 ?

Vue v for中為什麼要加屬性key

在vue官網中強烈推薦在使用v for時要加key屬性,這篇文章看看加屬性key和不加屬性key的區別。我們模擬一下vue中對這部分的處理流程。先建立3個div元素,內容為 xiaozhang xiaowang xiaoliu 然後在第乙個div元素之前再新增乙個新div元素xiaoli,渲染後的內...

v for中為什麼要加key,原理是什麼

原理 1.vue實現了一套虛擬dom,使我們可以不直接操作dom元素,只運算元據就可以重新渲染頁面,而隱藏在背後的原理是高效的diff演算法 2.當頁面資料發生改變,diff演算法只會比較同一層級的節點 3.如果節點型別不同,直接乾掉前面的節點,再建立並新增新的節點,不會再比較這個節點後面的子節點 ...

為什麼要加 include stdafx h

所謂標頭檔案預編譯,就是把乙個工程 project 中使用的一些mfc標準標頭檔案 如windows.h afxwin.h 預先編譯,以後該工程編譯時,不再編譯這部分標頭檔案,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。預編譯標頭檔案通過編譯stdafx.cpp生成,以工程名命名,由於預編...