React中使用collections时key的重要性详解


Posted in Javascript onAugust 07, 2017

前言

大家应该都知道,在 React 中 render collections 的 items 时, Keys 扮演着重要的角色, 它直接决定接下来的 rendered 和 re-rendered,下面话不多说,来一起看看详细的介绍:

React 不会 render 重复的 keys

为了彻底明白这个, 我们来声明一个这样的数组

const nums = [1, 2, 3, 5, 2]; // 它有两个元素的值是相等的

现在, 我们在 react 中来 render

<ul>
 {nums.map(num => <li key={num}>{num}</li>)}
</ul>

这小段代码构造出的理想 element 结构, 应该是这样的

<ul>
 <li key="1">1</li>
 <li key="2">2</li>
 <li key="3">3</li>
 <li key="5">5</li>
 <li key="2">2</li>
</ul>

然而, 实际 DOM 是这样的

<ul>
 <li>1</li>
 <li>2</li>
 <li>3</li>
 <li>5</li>
</ul>

React 给出了以下warning

React中使用collections时key的重要性详解 

意思就是, 你必须为数组中的元素提供唯一的 key 值

React 会 re-render 某个 key 指向的内容发生变化的元素

我们来看一个向 users 集合添加 user 的例子

const users = [
 {username:'bob'},
 {username:'sue'}
];

users.map((u, i) =>
 <div key={u.username}>{u.username}</div>);

render 的结果如下

<div key="bob">bob</div>
<div key="sue">sue</div>

现在, 我们更新一下 users

const users = [
 {username:'joe'},
 {username:'bob'},
 {username:'sue'}
];

render 的结果将会改变如下

<div key="joe">joe</div>
<div key="bob">bob</div>
<div key="sue">sue</div>

在上面例子中, React 调用了它的 Reconciliation 算法, 然后把返回的结果也就是一个 key 为 sue 的新元素添加到了 users 的最前面

如何选择 Key

其实, 即使内容没有发生变化, 改变对应的 key 值, React 也会触发 re-render.

使用 map 函数的 index 来作为元素的 key, 对开发者来说是常见的, 因为有时这是必要的, 然而, 有时这也会导致性能下降问题

users.map((u, i) =>
 <div key={i}>{u.username}</div>);

还是以上的例子, 作了一点小小的改变后, React 瞬间由一个步骤变成了三个步骤:

  • 将 id 为 "1" 的元素从 "bob" 更改为 "joe"
  • 将 id 为 "2" 的元素从 "sue" 更改为 "bob"
  • 新增一个 id 为 "3" 的元素, 他的值为 "sue"

总结

所以, 当我们使用 collections 时, 不仅不能忘了 Key, 还要学会选择好的 Key.

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

原文链接: Why you need keys for collections in React

Javascript 相关文章推荐
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
Aug 02 Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 Javascript
jQuery zTree加载树形菜单功能
Feb 25 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
MockJs结合json-server模拟后台数据
Aug 26 Javascript
微信小程序实现点赞业务
Feb 10 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
react路由配置方式详解
Aug 07 #Javascript
深入理解vue.js中$watch的oldvalue与newValue
Aug 07 #Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 #Javascript
react native仿微信PopupWindow效果的实例代码
Aug 07 #Javascript
jquery+css实现简单的图片轮播效果
Aug 07 #jQuery
bootstrap table表格客户端分页实例
Aug 07 #Javascript
基于JS递归函数细化认识及实用实例(推荐)
Aug 07 #Javascript
You might like
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
php 静态页面中显示动态内容
2009/08/14 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
php写的AES加密解密类分享
2014/06/20 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
让您的菜单不离网站
2006/10/03 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python编码类型转换方法详解
2016/07/01 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python中import机制详解
2017/11/14 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
机器学习实战之knn算法pandas
2019/06/22 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
高中生学习总结的自我评价范文
2013/10/13 职场文书
后进生转化工作制度
2014/01/17 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
2015年环卫工作总结
2015/04/28 职场文书
2015年团队工作总结范文
2015/05/04 职场文书