為什么React列表要加key且不推薦使用index

遍歷對(duì)象的每一個(gè)屬性深度對(duì)比是非常浪費(fèi)性能的。
React使用列表的key來(lái)進(jìn)行對(duì)比,如果不指定,就默認(rèn)為index下標(biāo)。
那么,為什么不指定key/用index下標(biāo)是不好的呢?

假設(shè)現(xiàn)在有這樣一段代碼

let obj = [{username: 'faith'}, {username: 'tt'}];
obj.map((item,index) => { return <div key={index}> {item.usernae} </div> })

它會(huì)渲染出以下DOM樹(shù)

<div key = '0'> faith </div>
<div key = '1'> tt </div>

然后用戶做了某個(gè)操作, obj被unshift 另一個(gè)對(duì)象,變成:

let obj = [ {username: 'love'}, {username: 'faith'}, {username: 'tt'}];

此刻的DOM樹(shù)會(huì)如下

<div key = '0'> love </div>
<div key = '1'> faith </div>
<div key = '2'> tt </div>

DOM樹(shù)的前后對(duì)比如下

image.png

由于React是根據(jù)key值來(lái)識(shí)別變化的,雖然我們?nèi)祟惪梢钥闯鍪切略隽薼ove,但是React的變化是:

  • faith >> love
  • tt >> faith
  • 新增 tt

這是比較消耗性能的。

如果我們一開(kāi)始代碼如下

let obj = [{username: 'faith'}, {username: 'tt'}];
obj.map((item,index) => { return <div key={item.username}> {item.usernae} </div> })

那么前后DOM的對(duì)比如下


<div key = 'faith'> faith </div>
<div key = 'tt'> tt </div>


<div key = 'love'> love </div>
<div key = 'faith'> faith </div>
<div key = 'tt'> tt </div>

image.png

React就認(rèn)為我們是新增,性能就比較好。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容