reactmap给了key仍然提示错误(react为什么不推荐使用index作为key)
reactmap给了key仍然提示错误
react为什么不推荐使用index作为key1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同
2.相同继续对比他们的内容,不同生成新的真实dom进行替换
3.如果内容和key都相同,复用旧的真实dom 不做改变
那么如果我们使用遍历时候自动生成的index作为每个节点的key可能会出现什么问题呢? 下面放个小案例
首先,初始时我们进行遍历persons
他会是这样一个过程,源数据
persons: [ { id: 1, name: “张三”, age: 15 }, { id: 2, name: “李四”, age: 16 }, ],
生成的真实dom节点
<ul> <li key="0">张三--15</li> <li key="1">李四--16</li> </ul>
然后我们在这个名单前面插入一个{id:3,name:‘王五',age:14}的数据会变成这样子
<ul> <li key="0">王五--14</li> <li key="1">张三--15</li> <li key="2">李四--16</li> </ul>
通过上面的更新可以发现 王五将之前张三的key给占用了
也就是说当我进行更新这一过程首先新的虚拟dom
<li key="0">王五--14</li>
和旧的虚拟dom
<li key="0">张三--15</li>
进行比较 新的dom先比较key两人相同,在比较内容一个是王五–14 一个是张三15 ,内容发生变化了,这时就会进行使用新的虚拟dom生成新的真是dom重新渲染页面,而且不仅是之前的张三受影响需要重新生成,后面的李四也要被张三进行替换在生成一个新的内容为张三的真实dom,这样就会导致所有的dom都要重新生成重新渲染,导致性能下降
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script> <li id="root"></li> <script type="text/babel"> let root = document.getElementById("root"); class App extends React.Component { constructor(props) { super(props); } state = { persons: [ { id: 1, name: "张三", age: 15 }, { id: 2, name: "李四", age: 16 }, ], }; handle = () => { const { persons } = this.state; const p = { id: 0, name: "王五", age: 14, }; this.setState({ persons: [p, ...persons], }); }; render() { return ( <li> <button onClick={this.handle}>点击添加</button> <ul> {this.state.persons.map((person, index) => ( <li key={index}> {person.name}--{person.age} </li> ))} </ul> </li> ); } } ReactDOM.render(<App name="hell" />, root); </script> </body> </html>
试想一下经过上面的推导致,如果我们使用id作为唯一的key值会怎么样呢
更新前
<ul> <li key="1">张三--15</li> <li key="2">李四--16</li> </ul>
更新后
<ul> <li key="0">王五--14</li> <li key="1">张三--15</li> <li key="2">李四--16</li> </ul>
这次 虽然王五插入的还是张三的前面但是只对比了一次 王五和上面是否有一样的key=0的节点 ,没有生成新的真实dom进行渲染,而张三和上面key=1的进行对比,发现上面有一个key=1的节点,然后再对比他们的内容是否相同,发现内容也相同,那么就可以复用旧的真实dom,节约性能
到此这篇关于react为什么不推荐使用index作为key的文章就介绍到这了,更多相关react index作为key内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- react怎么使用父组件(关于antd tree和父子组件之间的传值问题react 总结)
- reactnative示例代码(React Native项目框架搭建的一些心得体会)
- react配置上下文路由(React中Portals与错误边界处理实现)
- react的动画实现(React实现动效弹窗组件)
- react代码质量检查(react如何实现一个密码强度检测器详解)
- react动态创建菜单并实现局部刷新(使用react-virtualized实现图片动态高度长列表的问题)
- vue react和angular(详解React Angular Vue三大前端技术)
- react新手指引页面编写(React+TypeScript进行项目构建案例讲解)
- vue3 props用法(vue3组合API中setup、 ref、reactive的使用大全)
- react组件之间通信(React传递参数的几种方式)
- react和antd项目教程(React引入antd-mobile+postcss搭建移动端)
- react native常用组件(react native环境安装流程)
- react实现js控制样式(React + Threejs + Swiper 实现全景图效果的完整代码)
- reactredux任务处理进度(一文搞懂redux在react中的初步用法)
- react 使用实例(React+高德地图实时获取经纬度,定位地址)
- react执行流程(React开启代理的2种实用方式)
- 记者手记 书记带我去 巡街(记者手记书记带我去)
- 富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元 | 美通社(富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元)
- 二次创业 的富士胶片,在进博会上首次展示完成转型后的全线医疗产品(二次创业的富士胶片)
- 富士胶片 中国 我们对上海的信心没有任何改变(富士胶片中国)
- 赢麻了 富士公布2021年度财报 营利同比增长240(富士公布2021年度财报)
- 医事文化谈屑 | 古人的名 字 号(医事文化谈屑古人的名)
热门推荐
- secure file(解决出现secure_file_priv null的问题)
- html53d效果代码(HTML5 直播疯狂点赞动画实现代码 附源码)
- php怎么实现邮件发送(使用php的mail函数实现发送邮件功能)
- docker 默认内存(docker 运行指定内存的操作)
- laravel消息机制(laravel框架中间件 except 和 only 的用法示例)
- C#中==、Equals、ReferenceEquals的区别
- 什么是iis连接数
- CSS边框border样式缩写
- 安装apache服务器配置(Apache 配置详解最好的APACHE配置教程)
- mysql中json的支持(MySQL中json字段的操作方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9