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 tools之tooltip
Jul 25 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
Mar 15 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
Sep 18 Javascript
跟我学习javascript的异步脚本加载
Nov 20 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
BootStrapTable服务器分页实例解析
Dec 20 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
JavaScript原型式继承实现方法
Nov 06 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 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字符串过滤与替换小结
2015/01/26 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
php如何获取Http请求
2020/04/30 PHP
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python实现周期方波信号频谱图
2018/07/21 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
简单了解Django项目应用创建过程
2020/07/06 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
人力资源主管职责范本
2014/03/05 职场文书
年终奖发放方案
2014/06/02 职场文书
应届大专生求职信
2014/06/26 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技