美文网首页
react中key值的添加

react中key值的添加

作者: 娘娘羌 | 来源:发表于2019-02-26 17:28 被阅读0次

回想下,当我们在react开发中是不是经常写下面的代码

const data = [a, b, c];
<ul>{
  data.map((item,index)=>{
    return <li key={index}>item <input type="text"/></li>
  })
}</ul>

当我们通过数组来动态渲染一批组件时,react要求我们必须为每一个组件添加一个唯一的key值,不然就会在控制台出现如下warning:warning.js:33 Warning: Each child in an array or iterator should have a unique "key" prop.
如果添加的key值有重复,那么重复的组件只会渲染出一个,并且react给出提示 :Child keys must be unique; when two children share a key, only the first child will be used.
添加key值需要遵循:

  1. 必需性
    key值在react中的用途可大呢,diff时根据开发者添加的key来判断新旧组件是否为同一个组件,进而决定是执行insert、remove、move操作,而这将影响页面渲染的速度和性能。至于为什么key这么重要,控制台不是报错而是警告呢?因为你实在不加key的情况,react默认取遍历的index。
  2. 唯一性
    key值只需要在同一次map中保证唯一。
    react利用key来识别组件,它是一种身份标识标识,就像我们的身份证用来辨识一个人一样。每个key对应一个组件,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建。
  3. 稳定性
    不要用index作为组件的key,index并不能唯一的标识一个组件。如果只是单纯的用作展示,到还可以。但若涉及到新增、删除元素或者重新排序时,就可能出现问题。有位大神举的例子可以很好的阐述这个问题,我就直接引用下
    文章开头的例子,渲染出的结构如下
<ul>
  <li key=0>a <input type="text"/></li>
  <li key=1>b <input type="text"/></li>
  <li key=2>c <input type="text"/></li>
</ul>

依次在三个input中输入1、2、3

image1.png
增加一条数据data = [g, a, b, c]后,渲染结构如下
<ul>
  <li key=0>g <input type="text"/></li>
  <li key=1>a <input type="text"/></li>
  <li key=2>b <input type="text"/></li>
  <li key=3>c <input type="text"/></li>
</ul>
页面结果: image2.png

与我们期望的结果并不一致,为什么input框内的值错位了呢
上面实例中在数组新增后,前三个key对应的实例都没有销毁,而是重新更新。具体更新过程我们拿key=0的元素来说明, 数组新增后:

  • 组件重新render得到新的虚拟dom;
  • 新老两个虚拟dom进行diff,新老版的都有key=0的组件,react认为同一个组件,则只可能更新组件;
  • 然后比较其children,发现内容的文本内容不同(由a--->c),而input组件并没有变化,这时触发组件的componentWillReceiveProps方法,从而更新其子组件文本内容;
  • 因为组件的children中input组件没有变化,其又与父组件传入的新props没有关联,所以input组件不会更新(即其componentWillReceiveProps方法不会被执行),导致用户输入的值不会变化。
    这就是index作为key存在的问题,所以不要使用index作为key。
    也不能用Math.random()生成key值,这样虽然能保证key值的唯一性,但是会导致数组每次改变时,组件都重新销毁并新建,耗费性能。还可能导致一些意想不到的问题。

参考文献

React之key详解

相关文章

  • react中key值的添加

    回想下,当我们在react开发中是不是经常写下面的代码 当我们通过数组来动态渲染一批组件时,react要求我们必须...

  • echarts图 饼图

    1 强制react组件实时刷新添加一个key 值,触发的时候,改变key值,带动组件更新 2 饼图 呈现的效果:

  • 使用IKPictureTaker调不起摄像头问题

    需要在info.plist中添加下面key值 NSCameraUsageDescription

  • react key的问题

    key的作用 问题:key值用id还是index react会同过key的值来更新dom对象,达到最小化渲染页面,...

  • Map接口中的常用方法

    put (K key, V value) 向指定集合中添加指定的Key与value返回值V:当储存的key不重复,...

  • React的key

    react中的key的选择父元素下面的子节点之间需要设置一个唯一的key值,方便diff算法计算。Key 应该具有...

  • redis数据操作常用语句

    【String】 添加 set key value设置key的值为valuesetex key n value设置...

  • React虚拟dom中的key值

    1.虚拟dom中key的作用:(1)简单的说,key是虚拟dom对象的标识,在更新显示时key起着及其重要的作用;...

  • iOS 修改app名称

    在info.plist文件中添加key值Bundle display name+app名称

  • 关闭iOS13系统下App的暗黑模式

    在Info.plist文件中添加Key:User Interface Style,值类型设置为String,值为L...

网友评论

      本文标题:react中key值的添加

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