React:List and key
在React中,可以通过数组方法返回一组 组件元素,并将该数组作为render()的js插值。
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<li>{number}</li>
);
return (
<ul>{listItems}</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('root')
);
当我们创建列表时,要记得在列表元素中(不单指li,一组div或其他以数组形式渲染的标签也一样)添加key特性。key的值是一个字符串,它表示在列表中该元素的标志(或者说id)。key的作用主要是让DOM在重新渲染前能比较出列表中的哪些元素不必重新渲染,降低了开销。“When children have keys, React uses the key to match children in the original tree with children in the subsequent tree.”-- in-depth explanation about why keys are necessary
const listItems = numbers.map((number) =>
<li key={number.toString()}>
{number}
</li>
);
生成组件数组时,如果元素本身有id,我们将id作为数组元素的key即可;如果没有的话,我们往往会使用index索引替代。但文档不推荐,因为当生成的列表在以后的行为中发生动态增删/重新排序的话,索引就没意义了,此时重新渲染的效率依然不高。
为什么呢?因为React使用key,是为了标识组件。key相同的时候,React只会更新组件的已变化属性,key不同时,才会销毁重新创建。
举例,用数组['Alan','Mar','Kat']生成一组li,以索引为key,得到:
(key0)Alan,input1
(key1)Mar ,input2
(key2)Kat ,input3
对数组进行排序后,['Kat','Alan','Mar'],此时再以索引为key生成列表,得到:
(key0)Kat ,input1
(key1)Alan ,input2
(key2)Mar ,input3
发现名字后面对应的原先的input并未发现更新。因为对React来说,key相同的组件被React认定是同一个组件,哪怕名字在排序后改变,并在重新渲染后体现,但原先的key0和现在的key0仍被看作同一个组件,其底下的input不会发生更改。
*key应该放在数组所在上下文的(自定义)元素的特性上。
const listItems = numbers.map((number) =>
// Correct! Key should be specified inside the array.
<ListItem key={number.toString()}
value={number} />
);
return (
<ul>
{listItems}
</ul>
);
由于往往用数组方法如map生成组件数组,因此在map方法中给元素加key就好了。
在render函数return的JSX中:
{numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
)}
等价于
const listItems = numbers.map((number) =>
<ListItem key={number.toString()}
value={number} />
);
//...
<ul>
{listItems}
</ul>
刚看到一篇关于react的所谓学习路线:react入门、react router、redux 然后是 react native
这让我想起vue、vue router、vuex.......
真的吼相似.......
React:List and key的更多相关文章
- React 中的key值
在react中必须要有key值,key不是用来提升react的性能的,react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key p ...
- react中对于key值的理解
1.key是用来帮助react识别哪些内容被更改.添加或者删除.key需要写在用数组渲染出来的元素内部,并且需要赋予其一个稳定的值.如果key值发生了变更,react则会触发UI的重渲染. 2.在相邻 ...
- React之key详解
一个例子 有这样的一个场景如下图所示,有一组动态数量的input,可以增加和删除和重新排序,数组元素生成的组件用index作为key的值,例如下图生成的ui展示: 上面例子中的input组件渲染的代码 ...
- REACT Missing “key” prop for element
https://stackoverflow.com/questions/48266018/missing-key-prop-for-element-reactjs-and-typescript Whe ...
- React组件中的key
React组件中的key 一.key的作用 react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给reac ...
- react key的作用
react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给react自己用的. 简单来说,react利用key ...
- 【react】---react中key值的作用
一.React中key值得作用 react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的,而是给React自己使用,有了key属性后,就可以与组件建立了一种对应关系,简单说,react利 ...
- 深入理解React key
一 react 组件元素的 diff 算法 二 key 的理解 概述 react 中的key 属性,它是一个特殊的属性,它的出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key ...
- React key究竟有什么作用?深入源码不背概念,五个问题刷新你对于key的认知
壹 ❀ 引 我在[react]什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行一文中介绍了react对于fiber处理的协调与提交两个阶段,而在介绍协调时 ...
随机推荐
- 2019-2020-1 20199325《Linux内核原理与分析》第一周作业
1.显示一句话welcome !/bin/bash script4-1.sht var1="welcome to use Shell script" echo $var1 pwd ...
- Asynchronous Disk I/O Appears as Synchronous on Windows
Summary File I/O on Microsoft Windows can be synchronous or asynchronous. The default behavior for I ...
- Windows 计划任务 如果选择未登录就运行 则看不到GUI
You can specify that a task should run even if the account under which the task is scheduled to run ...
- 在Spring Boot使用H2内存数据库
文章目录 添加依赖配置 数据库配置 添加初始数据 访问H2数据库 在Spring Boot使用H2内存数据库 在之前的文章中我们有提到在Spring Boot中使用H2内存数据库方便开发和测试.本文我 ...
- 【Linux常见命令】route命令
route - show / manipulate the IP routing table route命令用于显示和操作IP路由表. route命令用来显示并设置Linux内核中的网络路由表,rou ...
- material UI中withStyles和makeStyles的区别
在material UI中,withStyles和makeStyles是经常使用的两个用于封装样式的函数.对于刚使用material UI的开发者而言,可能不太清楚这两者的区别. 本文简要探究 ...
- Eclipse插件svn和TortoiseSvn版本对应关系
2019独角兽企业重金招聘Python工程师标准>>> 先说一下今天碰到问题,自己在建svn仓库和导入,导出时因为版本不一致导致的错误. 因此一定要保证Eclipse中svn插件版本 ...
- 瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
简介 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template M ...
- 2019 ICPC 银川网络赛 H. Fight Against Monsters
It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...
- zwx_helper
通过重载c++operator,实现一种轻松的wxWidgets界面编程风格,如html编写页面一样直观容易. 举一例,一个界面页有四块区,如果是开发html的话,是从头到脚一气书写 <div ...