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获取父窗口的元素
Jun 26 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
JavaScript中Math.SQRT2属性的使用详解
Jun 14 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
Vue项目服务器部署之子目录部署方法
May 12 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 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判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
python调用windows api锁定计算机示例
2014/04/17 Python
Python中bisect的用法
2014/09/23 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
请解释virtual关键字的含义
2015/06/17 面试题
跟单文员岗位职责
2014/01/03 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
股权转让协议书
2014/12/07 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
作息时间调整通知
2015/04/22 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers