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 native web白屏(关于React Native 无法链接模拟器的问题)
- react初学难点(使用react的7个避坑案例小结)
- yii2对比springboot(yii2.0框架使用 beforeAction 防非法登陆的方法分析)
- react组件分析(react-diagram 序列化Json解读案例分析)
- react事件绑定的方式和区别(react合成事件与原生事件的相关理解)
- reactnative示例代码(React Native项目框架搭建的一些心得体会)
- react 的事件机制(React如何优雅的捕获异常)
- react组件的参数怎样定义的(详解React中组件之间通信的方式)
- react加载优化(React星星评分组件的实现)
- react组件参数(浅析React中的受控组件和非受控组件)
- react基础知识详解(如何深入理解React的ref 属性)
- react的setstate第二个参数(示例详解react中useState的用法)
- react 查看word文件(React实现导入导出Excel文件)
- react子组件的动态参数(浅谈React Component生命周期函数)
- vue3中的setup的参数(Vue3中ref与reactive的详解与扩展)
- react性能优化是哪个周期(React 并发功能体验前端的并发模式)
- 这里输入关键词(如何输入关键词)
- 熊猫中国国宝(熊猫国宝酒53酱香)
- 春节会放假几天(春节会放假吗)
- 小浴室,大民生 缙云3200多户困难群众洗上免费热水澡(小浴室大民生缙云3200多户困难群众洗上免费热水澡)
- 元旦闲谭(元旦闲谭)
- 息烽 这个村 治垃圾 有招 人人争当卫生模范(息烽这个村治垃圾)
热门推荐
- php判断类的属性的修饰(PHP whois查询类定义与用法示例)
- mysql中json的支持(MySQL中json字段的操作方法)
- 最小web服务器linux系统(常用的web服务器软件整理win+linux)
- docker本地项目生成镜像(docker images本地迁移的实现)
- python编写程序读写数据库(详解js文件通过python访问数据库方法)
- CSS优雅降级和渐进增强
- python进度条怎么实现(Python小进度条显示代码)
- sqlserver提供的内置函数(Sqlserver 自定义函数 Function使用介绍)
- sqlserver查看某个库所有表(SQL Server怎么找出一个表包含的页信息Page)
- python随机生成时间戳(python时间序列按频率生成日期的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9