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代码质量检查(react如何实现一个密码强度检测器详解)
- react组件分析(react-diagram 序列化Json解读案例分析)
- 使用react生命周期的常见情况(react+ts实现简单jira项目的最佳实践记录)
- react和antd管理系统(手把手教你从零开始react+antd搭建项目)
- react的事件绑定(React事件绑定的方式详解)
- react教程简介(react入门级详细笔记)
- react基础知识详解(如何深入理解React的ref 属性)
- react组件封装成函数方法(React虚拟列表的实现)
- react的setstate第二个参数(示例详解react中useState的用法)
- react性能优化是哪个周期(React 并发功能体验前端的并发模式)
- react native常用组件(react native环境安装流程)
- reactnative ios(详解React Native与IOS端之间的交互)
- react动态创建菜单并实现局部刷新(使用react-virtualized实现图片动态高度长列表的问题)
- react app框架(浅谈React原生APP更新)
- react重点和难点(关于React状态管理的三个规则总结)
- reactmap给了key仍然提示错误(react为什么不推荐使用index作为key)
- 终于来了,淘宝更改账户名测试中,快去看看你能不能修改(淘宝更改账户名测试中)
- 淘宝支持账号名修改,网友 终于可以 重新做人 了(淘宝支持账号名修改)
- 盘点那些年让人称奇的年终奖 最后一个赢辣条毫无悬念(盘点那些年让人称奇的年终奖)
- 你还没有升职吗 他竟因为几套激励理论,升职了(你还没有升职吗)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
- 职场人改不掉这4个习惯,只会越混越穷,一辈子也翻不了身(职场人改不掉这4个习惯)
热门推荐
- springboot vue 异地登录(vue+springboot实现登录验证码)
- dede常用变量(dede调用文章第一张图片非缩略图的实现方法)
- css cursor鼠标效果
- 常用的几种jsp开发环境搭建(怎么一键安装Jsp网站程序?Jsp环境一键配置软件JspStudy推荐)
- sql查询union怎么用(SQL语句之Union和Union All的用法)
- 云服务器如何进入(云服务器配置怎么看?)
- 安装hbase1.1.2(Vmware + Ubuntu18.04 安装 Hbase 2.3.5的详细教程)
- 怎么把jar包部署到tomcat(使用tomcat设定shared lib共享同样的jar)
- python 二维数组怎么取第二列(python实现二维数组的对角线遍历)
- Response.Expires的用法
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9