iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react为什么不推荐使用index作为key
  • 668
分享到

react为什么不推荐使用index作为key

2024-04-02 19:04:59 668人浏览 独家记忆
摘要

1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同 2.相同继续对比他们的内容,不同生成新的真实dom进行替换 3.如果内容和key都相同,复用旧的真实dom 不做改

1.旧的虚拟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>

    <div id="root"></div>
    <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 (
            <div>
              <button onClick={this.handle}>点击添加</button>
              <ul>
                {this.state.persons.map((person, index) => (
                  <li key={index}>
                    {person.name}--{person.age}
                  </li>
                ))}
              </ul>
            </div>
          );
        }
      }
      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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: react为什么不推荐使用index作为key

本文链接: https://www.lsjlt.com/news/130931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react为什么不推荐使用index作为key
    1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同 2.相同继续对比他们的内容,不同生成新的真实dom进行替换 3.如果内容和key都相同,复用旧的真实dom 不做改...
    99+
    2024-04-02
  • Vue中为什么不推荐用index做key详解
    目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供...
    99+
    2024-04-02
  • Vue 中为什么不推荐用index 做 key属性值
    目录前言key 的作用key 在 diff 算法中的角色同步头部节点同步尾部节点添加新的节点删除多余节点最长递增子序列为什么不要用 index性能消耗数据错位解决方案总结前言 前端开...
    99+
    2024-04-02
  • 在vue中为什么不能用index作为key
    目录一、key的作用是什么?二、什么是虚拟DOM?三、什么是diff算法四、为什么不能用index作为key?(1)index不能作为key--情景一(2)index不能作为key-...
    99+
    2024-04-02
  • 为什么不推荐使用C++
    这篇文章主要讲解了“为什么不推荐使用C++”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不推荐使用C++”吧!(1) C++语法很复杂,好的C++程序员难求。语法上 C++14 开始的...
    99+
    2023-06-16
  • 为什么java不推荐使用vector
    从网上各处搜集的知识整理出来1.因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer2.Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半3.Vector分配内存的时候需要连续的存储空间,如果...
    99+
    2023-06-03
  • react为什么推荐函数组件
    本教程操作环境:Windows7系统、react18版、Dell G3电脑。当使用React框架开发的时候,有两种方式创建组件,使用函数和使用类,目前函数组件越来越流行。下面通过举例的方式,分析函数组件和类组件的不同,并总结一下使用函数组件...
    99+
    2023-05-14
    javascript React
  • Spring为什么不推荐使用@Autowired注解详析
    目录引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议使用@Resource代替@...
    99+
    2024-04-02
  • Vue中不推荐用index做key的原因有哪些
    这篇文章主要介绍了Vue中不推荐用index做key的原因有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端开发中,只要涉及到列表渲染,那么无论是 React 还是 V...
    99+
    2023-06-21
  • 为什么Spring和IDEA都不推荐使用@Autowired注解
    目录前言Spring为什么不推荐使用@Autowired 注解背景原因解决思考@Autowired, @Qualifier, @Resource, 三者有何区别参考文档前言 请看下面...
    99+
    2024-04-02
  • Spring和IDEA为什么都不推荐使用@Autowired注解
    今天小编给大家分享一下Spring和IDEA为什么都不推荐使用@Autowired注解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • 为什么不建议使用Java自定义Object作为HashMap的key
    目录前言踩坑历程回顾hashCode覆写的讲究为什么hashCode和equals要同时覆写数据退出机制的兜底总结前言 此前部门内的一个线上系统上线后内存一路飙高、一段时间后直接占满...
    99+
    2024-04-02
  • vue为什么使用key
    vue使用key的原因是:需要使用key来标识每个节点,这样的话diff算法才能正确的识别此节点,此做法主要是为了能够高效的更新虚拟dom。...
    99+
    2024-04-02
  • 解析Idea为什么不推荐使用@Autowired进行Field注入
    目录Spring常见的DI方式@Autowired VS @Resource各种DI方式的优缺点Field注入的缺点为什么IDEA只对@Autowired警告大家在使用IDEA开发的...
    99+
    2024-04-02
  • React为什么不将Vite作为构建应用的首选
    React为什么不将Vite作为构建应用的首选?下面本篇文章就来带大家聊聊React不将Vite作为默认推荐的原因,希望对大家有所帮助!在React文档中,对于构建新的React应用,首推的方式是CRA(create-react-app)。...
    99+
    2023-05-14
    React.js Vite 前端
  • 为什么不使用isSuccess作为变量名
    本篇内容介绍了“为什么不使用isSuccess作为变量名”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在日常开发中,我们会经常要在类中定义布...
    99+
    2023-06-04
  • 游戏行业为什么推荐使用高防服务器
    游戏行业推荐使用高防服务器的原因有:1.攻击频繁,高防服务器可以抵御恶意的DDoS和CC攻击;2.缺乏服务能力,高防服务器稳定性好,可以应付大流量攻击;3.竞争激烈,高防服务器可以提供安全的网络运行环境,避免黑客入侵;具体分析如下:攻击频繁...
    99+
    2024-04-02
  • react中key的作用是什么
    本文小编为大家详细介绍“react中key的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中key的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • 为什么MySQL不建议使用NULL作为列默认值?
    1 前言 NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束. 有些开发人员在创建数据表时,由于懒惰直...
    99+
    2023-09-10
    mysql 数据库
  • 聊聊为啥go中的receiver name不推荐用this/self
    本篇文章给大家带来了关于golang的相关知识,其中主要介绍了为啥go中的receiver name不推荐用this/self,原因是什么,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。为什么go中的receiver name不推荐使用...
    99+
    2023-05-14
    Golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作