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 相关文章推荐
Javascript 面向对象 对象(Object)
May 13 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
异步安全加载javascript文件的方法
Jul 21 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
vue实现简单表格组件实例详解
Apr 16 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
使用JavaScript进行表单校验功能
Aug 01 Javascript
微信小程序实现团购或秒杀批量倒计时
Nov 01 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
如何实现js拖拽效果及原理解析
May 08 Javascript
JavaScript前端面试组合函数
Jun 21 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定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
php实现zip文件解压操作
2015/11/03 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
解析Python编程中的包结构
2015/10/25 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
Django设置Postgresql的操作
2020/05/14 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
python如何随机生成高强度密码
2020/08/19 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
介绍一下grep命令的使用
2015/06/12 面试题
学习保证书范文
2014/04/30 职场文书
人事任命书格式
2014/06/05 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python