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 相关文章推荐
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
May 21 Javascript
jquery封装的对话框简单实现
Jul 21 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
Aug 23 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
layui点击导航栏刷新tab页的示例代码
Aug 14 Javascript
简单说说angular.json文件的使用
Oct 29 Javascript
node上的redis调用优化示例详解
Oct 30 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
Mar 13 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
vue路由缓存的几种实现方式小结
Feb 02 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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实现水仙花数的4个示例分享
2014/04/08 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python中字符串的处理技巧分享
2016/09/17 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
利用python循环创建多个文件的方法
2018/10/25 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
python数据类型强制转换实例详解
2020/06/22 Python
python绘制汉诺塔
2021/03/01 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
精彩广告词大全
2014/03/19 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
求职意向书
2014/07/29 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL