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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
Script的加载方法小结
Jan 12 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
Jan 08 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
Vue.js基础知识小结
Jan 13 Javascript
详解Angular 4.x NgIf 的用法
May 22 Javascript
利用Decorator如何控制Koa路由详解
Jun 26 Javascript
Vue 实现从文件中获取文本信息的方法详解
Oct 16 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 23 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
ajax缓存问题解决途径
2006/12/06 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python求crc32值的方法
2014/10/05 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
python 自动去除空行的实例
2018/07/24 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
爷爷追悼会答谢词
2014/01/24 职场文书
中介业务员岗位职责
2014/04/09 职场文书
机房搬迁方案
2014/05/01 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
车辆转让协议书
2014/09/24 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2015年环保局工作总结
2015/05/22 职场文书
运动会通讯稿200字
2015/07/20 职场文书