开发者要了解index作为key是反模式

开发 开发工具
我曾多次看到开发者在渲染列表的时候把列表项的index作为它的key。看起来很优雅,但这样做存在潜在的危险,请看文章详细介绍。

 我曾多次看到开发者在渲染列表的时候把列表项的index作为它的key。 

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

 这看起来很优雅,而且能够解决警告(这才是“真”问题,对吧?)的问题,这样做有什么危险呢?

It may break your application and display wrong data!

让我来解释,key是React唯一用来确定DOM元素的东西,如果你想列表增加一项或移除中间的某项,会发生什么事?如果key和之前一个一样React就会假定这个DOM元素和之前对应的组件是一个,但是它们可能并不是同一个了。

为了证明潜在的危险我创建了一个简单示例

 这表明,如果不指定key的时候React会使用index,因为这是那个时候最好的猜测,而且它会警告你说这不是最优解(它通过令人困惑的语句表述这个意思)。如果你主动提供了它,React就认为你知道你在干什么。记住这个示例,它能产生不可预测的结果。

比较好

像这样的应该都有一个永久的唯一的属性,当列表项创建的时候它是最合适被设置为key的,显然我是在说id,我们可以用下面的方式使用它: 

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

 另外的实现方式是把编号递增移动到抽象方法中,使用一个全局的index来确保任何两个列表项的id不同。 

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

 更好

一个产品级别的方案应该是一个更健壮的方法,能够处理分散创建列表项。因此,我推荐使用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。

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2018-06-15 08:43:33

Java堆外内存

2017-02-06 09:22:19

PHP开发Composer

2016-12-19 15:55:10

PHP开发者Composer

2017-01-15 17:48:04

Java开发者编程语言

2016-12-26 17:53:05

Java开发者编程语言

2017-02-05 16:00:35

Java编程语言

2020-04-03 09:00:00

微服务前端架构

2015-08-11 08:41:58

游戏数据游戏开发

2013-04-19 09:23:34

2013开发者开发趋势和技能

2011-09-20 09:27:50

Web

2020-03-04 11:20:22

DSL开发领域特定语言

2021-05-10 10:01:04

JavaScript开发技巧

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开发工具开发者

2011-08-01 16:39:21

Xcode 目录结构

2023-09-13 11:58:17

云原生反模式

2010-08-12 14:13:01

Flex开发者

2014-12-15 10:25:21

移动开发像素设计
点赞
收藏

51CTO技术栈公众号