React组件中的key
React组件中的key
一、key的作用
react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给react自己用的。
简单来说,react利用key来识别组件,它是一种身份标识标识,就像我们的身份证用来辨识一个人一样。每个key对应一个组件,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建。例如下面代码:
//this.state.users内容
this.state = {
users: [
{
id: 1,
name: '张三'
},
{
id: 2,
name: '李四'
},
{
id: 2,
name: "王五"
}],
....//省略}
render()
return (
<div>
<h3>用户列表</h3>
{this.state.users.map(
u => <div key={u.id}>{u.id}: {u.name}</div>
)}
</div>
)
);
上面代码在dom渲染挂载后,用户列表只有张三和李四两个用户,王五并没有展示处理,主要是因为react根据key认为李四和王五是同一个组件,导致第一个被渲染,后续的会被丢弃掉。
这样,有了key属性后,就可以与组件建立了一种对应关系,react根据key来决定是销毁重新创建组件还是更新组件。
1) key相同,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。
2) key值不同,则react先销毁该组件(有状态组件的componentWillUnmount会执行),然后重新创建该组件。
3) setState:谁用到了所更新的state,就会刷新该组件,render也并不是所有都会变化,只变state改变的部分。
另外需要指明的是:
key不是用来提升react的性能的,不过用好key对性能是有帮组的。
应该知道React使用virtual dom来比较UI状态的变化,如果DOM中的某一节点更新时重新渲染,一样的话就不渲染。key属性的作用就在与解决渲染List的这种难题,简单来说,例如你有一个List:
<li>Orange</li> <li>Banana</li>
如果想更新成
<li>Apple</li> <li>Orange</li>
那dom比较算法就可以有多种选择,例如销毁两个,生成两个新的代替,或者销毁banana,在orange前插入apple等等,当list多的时候情况就比较复杂,所以React为了使得Dom比较算法最快,需要你提供给每一个list元素一个特殊的key,这样就容易比较前后两个大型的List了,帮助React如何移动、替代、销毁、插入节点,例如:
let List = this.props.fruits.map((fruit) => {
return <FruitList key={fruit.id} name={fruit.name}/>
});
return (<div>{List}</div>)
二、注意
1、key是React中使用的一种特殊的属性(除此之外还有ref属性)。当元素被创建的时候,React会将元素的key值和对应元素绑定存储起来。
2、尽管key看起来像是props的一部分,可是事实上我们无法通过this.props.key获取到key的值。React会在判断元素更新的时候自动使用key,而组件自己是无法获取到key的
3、当一个列表被重新渲染时,React会根据较新的元素内容依据相应的key值来匹配之前的元素内容。
4、当一个新的key值添加到列表中时,表示有一个组件被创建;被删除时表示有一个组件被销毁。
5、Key值可以让React明确标识每个组件,这样在重新渲染的时候保有对应的状态数据。
6、如果你去改变某个组件的key值的话,它会在下次渲染的时候被销毁并当作新的组件重新渲染进来
React组件中的key的更多相关文章
- react组件中刷新组件小技巧
在开发过程中,经常遇到组件数据无法更新,例如:当你用同一个表格展示不同数据的时候,当点击第5页后,再点击另外一份数据时发现还在第五页,并没有回到第一页. 怎么能让一个组件每次数据不一样时都重新加载呢, ...
- 规避 React 组件中的 bind(this)
React 组件中处理 onClick 类似事件绑定的时候,是需要显式给处理器绑定上下文(context)的,这一度使代码变得冗余和难看. 请看如下的示例: class App extends Com ...
- react组件中的constructor和super小知识
react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...
- 【React】282- 在 React 组件中使用 Refs 指南
英文:Yomi Eluwande 译文:joking_zhang https://segmentfault.com/a/1190000019277029 使用 React 时,我们的默认思维方式应该 ...
- React组件中对子组件children进行加强
React组件中对子组件children进行加强 问题 如何对组件的children进行加强,如:添加属性.绑定事件,而不是使用<div>{this.props.children}< ...
- 在 React 组件中使用 Refs 指南
原文:Fullstack React's Guide to using Refs in React Components作者:Yomi Eluwande译者:博轩 译文:https://segment ...
- 写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么
怼一波,在项目中有很多经常用到,但又含糊不清的知识点 框架中的key: 1. 为啥在遍历元素时要用 key :在开发过程中为了保证遍历同级元素的唯一性,用来提高更新 dom 的性能: 2. 凭啥要保证 ...
- 在 React 组件中监听 android 手机物理返回/回退/back键事件
当前端页面嵌入到 webview 中运行时,有时会需要监听手机的物理返回按键事件来做一些自定义的操作. 比如我最近遇到的,在一个页面里面有批量选择的功能,当点击手机的返回键时,清除页面上的选中状态.我 ...
- react组件中返回并列元素的方法
我们在写react组件的时候,经常会遇到这种问题,在render中return元素只能有一个顶级元素,比如div,假如写成这样就会报错: render(){ return( <div>12 ...
随机推荐
- Spark2.3 HA集群的分布式安装
一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...
- 解决CentOS缺少共享库
# ./aapt dump bading ./tmp/app_xxxx.apk ./appt:error while loading shared libraries: libraries: libs ...
- linux每日命令(21):find命令之exec
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. 一. exec参数说明: -exec 参数后面跟的是com ...
- MXNET:权重衰减-gluon实现
构建数据集 # -*- coding: utf-8 -*- from mxnet import init from mxnet import ndarray as nd from mxnet.gluo ...
- Jquery计算指定日期加上多少天、加多少月、加多少年的日期
/* * 功能:实现VBScript的DateAdd功能. * 参数:interval,字符串表达式,表示要添加的时间间隔. * 参数:number,数值表达式,表示要添加的时间间隔的个数. * 参数 ...
- AI金融知识自学偏量化方向-目录0
前提: 统计学习(统计分析)和机器学习之间的区别 金融公司采用机器学习技术及招募相关人才 了解不同类型的机器学习 有监督学习 vs 无监督学习 迭代和评估 偏差方差权衡 结合有监督学习和无监督学习(半 ...
- OllyScripts 0.92帮助文档
-------------------------------Olly脚本插件v0.92 制作: SHaG文档汉化:ZMWorm[CCG][TT]E-Mail:TranslationTeam[at]1 ...
- hdoj:2045
#include <iostream> using namespace std; ]; int main() { int n; a[] = ; a[] = ; a[] = ; ; i &l ...
- 错误代码CS0051可访问性不一致_解决方案
一.问题的出现 用C#在写多线程时报错 二.解决方案 1,分析思路 本来对BaseStruct设置为私有访问,但调用时又想公开化,从而造成了编译错误. 2,解决 将红色部分改为公有 3,总结 注意pu ...
- [转]iOS 中几种定时器 - 控制了时间,就控制了一切
这篇文章是转载内容,原文地址:http://www.cocoachina.com/ios/20150519/11857.html?utm_source=tuicool 这里的知识点,其实在我们日常开发 ...