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中继承的三种方式
Oct 16 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
javascript中CheckBox全选终极方案
May 20 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
JS实现光滑展开合拢的菜单效果代码
Sep 16 Javascript
基于JavaScript代码实现随机漂浮图片广告
Jan 05 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
Mar 06 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
javascript数组元素删除方法delete和splice解析
Dec 09 Javascript
原生js实现自定义滚动条
Jan 20 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
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php发送邮件的问题详解
2015/06/22 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
php-app开发接口加密详解
2018/04/18 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
详解用vue编写弹出框组件
2017/07/04 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
vue v-model的用法解析
2020/10/19 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
详解flask表单提交的两种方式
2018/07/21 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
数据库基础的一些面试题
2012/02/25 面试题
高中生自我评价个人范文
2013/11/09 职场文书
党员岗位承诺书
2014/03/25 职场文书
工作检讨书500字
2014/10/19 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers