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读取中文cookie时的乱码问题的解决方法
Oct 14 Javascript
js动态加载以及确定加载完成的代码
Jul 31 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
jquery读取xml文件实现省市县三级联动的方法
May 29 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
element-ui 表格实现单元格可编辑的示例
Feb 26 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 Javascript
vue+elementUI 实现内容区域高度自适应的示例
Sep 26 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 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+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
php实现每日签到功能
2018/11/29 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
js创建对象的方式总结
2015/01/10 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
python中requests小技巧
2017/05/10 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python super用法及原理详解
2020/01/20 Python
自我介绍演讲稿
2014/01/15 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
小学开学寄语
2014/01/19 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
优质服务演讲稿
2014/05/14 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
拾金不昧表扬信
2015/01/16 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
重阳节活动主持词
2015/07/04 职场文书
公司周年庆典致辞
2015/07/30 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android