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实现点击同时更改两个iframe的网址
Jul 01 Javascript
JQUERY对单选框(radio)操作的小例子
Apr 25 Javascript
asm.js使用示例代码
Nov 28 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
Jul 17 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
Vue+Express实现登录状态权限验证的示例代码
May 05 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
JS对日期操作封装代码实例
Nov 08 Javascript
如何在Express4.x中愉快地使用async的方法
Nov 18 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php,ajax实现分页
2008/03/27 PHP
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
AngularJS基础知识
2014/12/21 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python3简单实现串口通信的方法
2019/06/12 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
python多线程和多进程关系详解
2020/12/14 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
单位办理社保介绍信
2014/01/10 职场文书
三字经教学反思
2014/04/26 职场文书
公司离职证明范本
2014/10/17 职场文书
治庸问责工作总结
2015/08/11 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python