美文网首页
react反模式——将数组的index作为key

react反模式——将数组的index作为key

作者: 我只是个NPC | 来源:发表于2017-05-25 17:18 被阅读1490次

示例

先看一段代码

constructor() {
    super();

    this.state = {
        sort: [{
            name: 'a'
          }, {
            name: 'b'
          }, {
            name: 'c'
        }]
    }
}
...
render() {
    return (
        <ul> 
          {this.state.sort.map((item, index) => {
            return <li key={index}>{item.name} <input type="text"/></li>
          })} 
        </ul>
    ); 
}
...

是不是很眼熟?在很长一段时间,我都是这么设置key来消除react的warning的,然后突然有次发现会出现这样的情况,见下图:

key_index.gif

出现这个情况,是因为react是以key来唯一标识组件的,当发现update前和update后key值没有变化,react就会认为update前后组件是同一个,进而只会对内部的属性进行修改。拿上面的例子来讲,就是react会作出这样的判断:

  • 检测key值,发现都是0,判定组件为同一个;
  • 检测item.name部分,发现有变化,重新渲染这部分;
  • 检测input,发现不依赖props,所以不进行重新渲染;

优化示例

这次我们将key设置为一个特殊字段,保证其唯一性,假设item.name是唯一的。

render() {
    return (
        <ul> 
          {this.state.sort.map((item, index) => {
            return <li key={item.name}>{item.name} <input type="text"/></li>
          })} 
        </ul>
    ); 
}

然后这次再看效果

key_name.gif

这次修改后,react在拿到key后,可以判断出key值和之前不一,再进行对比,发现组件的位置进行了交换,所以做出了符合我们预期的行为。

总结

渲染数组是非常常见的需求,但是选择哪个字段作为key需要慎重考虑,一点要保证其唯一性,尽量避免使用array的索引值作为其key值。

相关文章

  • react反模式——将数组的index作为key

    示例 先看一段代码 是不是很眼熟?在很长一段时间,我都是这么设置key来消除react的warning的,然后突然...

  • react反模式之index作为key

  • index作为key是反模式

    原文:Index as a key is an anti-pattern 我曾多次看到开发者在渲染列表的时候把列表...

  • react key

    为什么不能拿数组的index作为react的key 因为对于动态列表,如果索引对应的值发生了变化,尤其是排在前面的...

  • vue踩坑纪录

    1.v-for遍历的时候,千万不能将数组或者对象作为key!,务必绑定 :key="index"。 2.要想获取v...

  • HashMap 中的 hash 原理

    HashMap 内部是一个散列表(数组?),存放时取 key 的 hashCode 作为 index 位,如果出现...

  • js中 for in 与 for of 区别

    for in是ES5标准,遍历key. (遍历对象返回key, 遍历数组项返回数组的index) for of是...

  • php数组函数(部分)

    1. array_column(array,column_key[,index_key]);** 返回输入数组中某...

  • 数据结构-散列表(HashTable)

    本质 哈希表的底层数据结构是数组,数组中每一个元素存放的是键值对。 核心原理 f(key) = index 将ke...

  • React diff算法

    react/vue中,key的作用是什么? 为什么遍历时,key最好不要用index? 虚拟DOM中key的作用:...

网友评论

      本文标题:react反模式——将数组的index作为key

      本文链接:https://www.haomeiwen.com/subject/hyjzxxtx.html