React学习8(DOM的diff算法)

1.虚拟DOM中Key的作用

Key是虚拟DOM对象中的标识,当状态中的数据发生变化时,react会根据新数据生成新的虚拟

DOM,随后,react进行新虚拟Dom与旧虚拟DOM的差异比较,比较规则如下

2.对比规则

(1)旧虚拟DOM中找到了与新虚拟DOM相同的Key ,若虚拟DOM中内容没变,直接使用之前的虚

拟DOM 若虚拟DOM中内变了,容则生成新的真实DOM,随后替换掉页面中之前的真实DOM

(2)旧虚拟DOM中没有找到与新虚拟DOM相同的Key 创建新的真实DOM,随后渲染到页面

3.用index作为key可能会引发的问题

1).若对数据进行:逆序添加,逆序删除等破坏顺序操作:

会产生没有必要的真实DOM更新===>界面效果没有问题,但效率低

2).如果结构中还包含输入类的DOM

会产生错误的DOM更新===> 界面有问题

4.开发中如何选择key?

1).最好使用每条数据的唯一标识作为key,比如:ID,手机号,身份证,学号等

2).如果不存在对数据的逆序添加,逆序删除等破幻顺序的操作,仅用于渲染列表用于展示 使用

index作为key是没有问题的


  react中key的作用

  // 此处一定要写babel,将jsx转化为js
  class Person extends React.Component {
    state = {
      persons :[
        {id:'1', name:'小张', age: 18},
        {id:'2', name:'小刘', age: 19}
      ]
    }

    add = () => {
      const {persons} = this.state
      const p = {id:persons.length+1, name:'小王', age:20}
      this.setState({persons:[p, ...persons]})
    }

    render() {
      return (
        <div>
          <h2>展示人员信息</h2>
          <button onClick= {this.add}>点击添加小王</button>
          <h3>使用index(索引值)作为key</h3>
          <ul>
         {
          this.state.persons.map((personObj,index) => {
            return <li key= {index}>{personObj.name} - {personObj.age} <input/></li>
          })
         }
         </ul>
         <hr/>
         <hr/>
         <h3>使用id(数据的唯一标识)作为key</h3>
          <ul>
         {
          this.state.persons.map((personObj) => {
            return <li key= {personObj.id}>{personObj.name} - {personObj.age} <input/></li>
          })
         }
        </ul>
        </div>
      )
    }
  }

  ReactDOM.render(<Person />, document.getElementById('test'))

Original: https://blog.csdn.net/xiaojian044/article/details/128320886
Author: xiaojian044
Title: React学习8(DOM的diff算法)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744053/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • HZNU数模小测试解析

    一、填空题 在种群增长预测问题中,若资源环境等因素是有限的,则应使用的微分方程模型为 Logistic模型 某种群分为 4 个年龄组, 各组的繁殖率分别为 0, 0.8, 1.8,…

    Python 2023年6月9日
    061
  • 网站压力测试

    import requests from fake_useragent import UserAgent import multiprocessing import time fr…

    Python 2023年6月11日
    054
  • pandas 缺失数据处理大全(附代码)

    大家好,我是东哥。 之前一直在分享 pandas的一些骚操作:pandas骚操作,根据大家反映还不错,但是很多技巧都混在了一起,没有细致的分类,这样不利于查找,也不成体系。 利用闲…

    Python 2023年8月25日
    061
  • CSS 笔记

    CSS,或 Cascading Style Sheets (层叠样式表或级联样式表),用来给浏览器添加样式。 内联 Inline Style 使用 style 属性来引入 CSS …

    Python 2023年6月9日
    071
  • pywintypes.com_error: (-2147352567, ‘发生意外。’, (0, None, None, None, 0, -2146827284), None)

    通过 xlwings操作生成excel时意外报错(pywintypes.com_error: (-2147352567, ‘发生意外。’, (0, None…

    Python 2023年6月11日
    0127
  • QQ频道机器人开源-蓝图计划

    由于编写的比较仓促,很多细节都没有去处理,需要你们自己去填坑,就当提升一下技能吧 xiangsu.py 是图像处理模块,负责处理所有图像事务ymsql.py 是游戏逻辑以及数据库接…

    Python 2023年6月12日
    039
  • Numpy的代码使用

    文章目录 Numpy * 创建全0全1或没有任何具体值的数组 创建随机数组 查看ndarray的常用属性 数组和标量之间的运算 数组的索引和切片 数学和统计方法sum(和),mea…

    Python 2023年8月25日
    069
  • 数据分析(Data Analysis)

    数据分析 一、数据分析——基础 * 1.什么是数据分析 – 1.1数据分析的概念 1.2数据分析的应用 1.3数据分析方法 + 1.3.1对比分析 1.3.2同比分析 …

    Python 2023年8月15日
    075
  • 爬虫系列:爬虫验证码识别

    虽然大多数人对单词”CAPTCHA”都很熟悉,但是很少人知道它的具体含义:全自动区分计算机和人类的图灵测试(Completely Automated Pub…

    Python 2023年5月24日
    058
  • Pandas 毫秒级时间解析

    pandas 对含时间戳数据进行提取,读取时间可能是 int、str 的数据类型,因此第一步需要对齐进行时间解析。 创建一个DataFrame 测试数据 import pandas…

    Python 2023年8月7日
    035
  • 张量(Tensor)的降维与升维

    一、Tensor的降维——torch.squeeze()函数 1.tensor的维度 小编对于张量的理解一直很模糊,今天用Excel来帮助大家理解,希望对大家有所帮助。 首先,张量…

    Python 2023年8月30日
    073
  • 设计模式—适配器模式

    类型:结构型 目的:解决接口不兼容问题。 话不多说,看个案例吧。 优化案例 在真实的开发场景中,系统的每个模块都是分配给不同的团队或个人来开发的。这使得事前沟通变得尤为重要,且沟通…

    Python 2023年10月20日
    037
  • Django博文数据可视化、simple-ui优化、导入导出插件

    Django博文数据可视化、simple-ui优化、导入导出插件 今日任务 django博客admin优化 导入导出插件 DRF的action装饰器 博文数据可视化 昨日未解决问题…

    Python 2023年8月6日
    058
  • Pygame学习与实战02:搭建Pygame框架与主线程

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月20日
    048
  • 社区共读《Python编程从入门到实践》第7,8,9天阅读建议

    《Python 编程从入门到实践》 第 11 章讲解的内容是测试代码,而第 11 章学习完毕,你将进入本书的项目部分,开始实战! 第十一章阅读建议 unittest 模块学习后需要…

    Python 2023年9月19日
    048
  • Android App开发实战之实现微信记账本(附源码 超详细必看)

    需要源码或图片集请点赞关注收藏后评论区留言~~~ 一、需求描述 好用的记账本必须具备两项基本功能。一项时记录新帐单,另一项时查看账单列表,其中账单的记录操作要求用户输入账单的明细要…

    Python 2023年9月28日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球