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 相关文章推荐
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
js 金额文本框实现代码
Feb 14 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
详解JavaScript中undefined与null的区别
Mar 29 Javascript
Visual Studio中js调试的方法图解
Jun 30 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
Jun 06 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
JS实现直接运行html代码的方法
Mar 13 Javascript
纯js实现的积木(div层)拖动功能示例
Jul 19 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
Apr 11 Javascript
小程序组件之自定义顶部导航实例
Jun 12 Javascript
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中get_defined_constants函数用法实例分析
2015/05/12 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
微信自定义分享php代码分析
2016/11/24 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
JS画线(实例代码)
2013/11/20 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
javascript的函数作用域
2014/11/12 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
python ip正则式
2009/05/07 Python
Python中使用PDB库调试程序
2015/04/05 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
如何清空python的变量
2020/07/05 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
白血病募捐倡议书
2014/05/14 职场文书
商业街策划方案
2014/05/31 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL