自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開發(fā)者要了解index作為key是反模式

開發(fā) 開發(fā)工具
我曾多次看到開發(fā)者在渲染列表的時候把列表項的index作為它的key??雌饋砗軆?yōu)雅,但這樣做存在潛在的危險,請看文章詳細(xì)介紹。

 我曾多次看到開發(fā)者在渲染列表的時候把列表項的index作為它的key。 

  1. {todos.map((todo, index) => 
  2.   <Todo {...todo} 
  3.     key={index} /> 
  4. )} 

 這看起來很優(yōu)雅,而且能夠解決警告(這才是“真”問題,對吧?)的問題,這樣做有什么危險呢?

It may break your application and display wrong data!

讓我來解釋,key是React唯一用來確定DOM元素的東西,如果你想列表增加一項或移除中間的某項,會發(fā)生什么事?如果key和之前一個一樣React就會假定這個DOM元素和之前對應(yīng)的組件是一個,但是它們可能并不是同一個了。

為了證明潛在的危險我創(chuàng)建了一個簡單示例

 這表明,如果不指定key的時候React會使用index,因為這是那個時候最好的猜測,而且它會警告你說這不是最優(yōu)解(它通過令人困惑的語句表述這個意思)。如果你主動提供了它,React就認(rèn)為你知道你在干什么。記住這個示例,它能產(chǎn)生不可預(yù)測的結(jié)果。

比較好

像這樣的應(yīng)該都有一個永久的唯一的屬性,當(dāng)列表項創(chuàng)建的時候它是最合適被設(shè)置為key的,顯然我是在說id,我們可以用下面的方式使用它: 

  1. {todos.map((todo) => 
  2.   <Todo {...todo} 
  3.     key={todo.id} /> 
  4. )} 

 另外的實現(xiàn)方式是把編號遞增移動到抽象方法中,使用一個全局的index來確保任何兩個列表項的id不同。 

  1. todoCounter = 1; 
  2. function createNewTodo(text) { 
  3.   return { 
  4.     completed: false
  5.     id: todoCounter++, 
  6.     text 
  7.   } 

 更好

一個產(chǎn)品級別的方案應(yīng)該是一個更健壯的方法,能夠處理分散創(chuàng)建列表項。因此,我推薦使用shortid。它能夠快速生成“短 無序 url友好 唯一”的id,代碼像下面這樣: 

  1. var shortid = require('shortid'); 
  2. function createNewTodo(text) { 
  3.   return { 
  4.     completed: false
  5.     id: shortid.generate(), 
  6.     text 
  7.   } 

 TL;DR:為每個列表項生成一個唯一的id,并在渲染列表的時候使用它作為key。

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2018-06-15 08:43:33

Java堆外內(nèi)存

2017-02-06 09:22:19

PHP開發(fā)Composer

2016-12-19 15:55:10

PHP開發(fā)者Composer

2016-12-26 17:53:05

Java開發(fā)者編程語言

2017-02-05 16:00:35

Java編程語言

2020-04-03 09:00:00

微服務(wù)前端架構(gòu)

2017-01-15 17:48:04

Java開發(fā)者編程語言

2015-08-11 08:41:58

游戲數(shù)據(jù)游戲開發(fā)

2013-04-19 09:23:34

2013開發(fā)者開發(fā)趨勢和技能

2021-05-10 10:01:04

JavaScript開發(fā)技巧

2011-09-20 09:27:50

Web

2020-03-04 11:20:22

DSL開發(fā)領(lǐng)域特定語言

2012-02-06 09:14:24

2013-07-10 11:11:05

PythonGo語言

2017-06-26 15:32:59

前端編譯原理語言知識

2016-03-25 09:29:24

Apple開發(fā)工具開發(fā)者

2023-09-13 11:58:17

云原生反模式

2011-08-01 16:39:21

Xcode 目錄結(jié)構(gòu)

2014-12-15 10:25:21

移動開發(fā)像素設(shè)計

2010-08-12 14:13:01

Flex開發(fā)者
點贊
收藏

51CTO技術(shù)棧公眾號