react-节点更新与销毁

2023-11-03

更新与销毁

发生更新的场景:

  1. 重新调用ReactDOM.render,触发根节点更新
  2. 在类组件中调用setState,会导致该节点更新

节点更新

分为两种:

  • 如果调用的是ReactDOM.render,进入根节点的对比更新(也被称为diff算法)
  • 如果调用的是setState
    1. 运行生命周期函数, static getDerivedStateFromProps
    2. 运行shouldComponentUpdate,如果该函数返回false,则终止当前流程
    3. 运行render,得到一个新节点,对新节点进行对比更新
    4. 生命周期函数getSnapshotBeforeUpdate加入执行队列
    5. 生命周期函数componentDidUpdate加入执行队列

以上不管是哪一种,都要进行后续步骤:

  1. 更新虚拟DOM树
  2. 完成真实DOM的更新
  3. 调用执行队列中的componentDidMount、getSnapshotBeforeUpdate、componentDidUpdate

componentDidMount来源于新子代类组件的挂载

对比更新

将心产生的节点,对比之前虚拟DOM树中的节点,发现差异,完成更新

react为了提高对比效率,做出以下假设:

  • 假设节点不会出现层次的移动

    层次的移动就是比如原来A组件在第三层第一位,不会突然跑到第二层去
    对比的时候,react会直接找到旧树中该节点所在的对应位置进行对比

对比的方式:

  1. 不同的节点类型会生成不同的解构

    名词解释
    相同的节点类型: 节点本身类型相同(不管属性,虚拟DOM树更新前后节点都为div则相同,前为div后为p则不相同),如果是react元素则要求type值必须一致
    不同的节点类型: 非相同节点类型

  2. 多个兄弟通过唯一标识(key)来确定对比的新节点

    key值的作用: 用于通过旧节点,寻找对应的新节点,如果某个旧节点由key值,则其更新时,会在相同层级中找相同的key值进行对比
    key值应该在一个范围内(兄弟节点中)唯一,并且应该保持稳定(不要使用随机数之类的)

react依靠假设进行寻找,产生两种情况(找到与未找到)

找到了对比目标

如果找到了对比目标, 则进行节点类型判断

  • 节点类型一致
    根据不同的节点类型做不同的事情
    - 空节点: 不做任何事
    - DOM节点
    1. 直接重用之前的真实DOM对象
    2. 对比属性,将变动的属性记录下来,以待将来统一更新(现在不会发生变化)
    将来是啥时候? 往上看有个后续步骤,看到真实DOM更新了吗? 那就是将来
    3. 遍历该新React元素的子元素,进行递归对比更新
    递归对比更新: 说白了就是拿子元素重新走一遍更新流程
    - 文本节点
    a. 重用之前的真实DOM对象
    b. 将新的文本变化记录下来,将来完成更新
    - 组件节点: 分为函数组件与类组件
    - 函数组件: 重新调用函数,得到一个新的节点对象,进行递归对比更新
    - 类组件:
    1. 重用之前的实例,
    2. 调用生命周期方法 static getDerivedStateFromProps
    3. 调用生命周期方法shouldComponentUpdate, 若该方法返回false,则终止
    4. 运行render,得到新的节点对象,进行递归对比更新
    5. 生命周期函数getSnapshotBeforeUpdate加入执行队列
    6. 生命周期函数componentDidUpdate加入执行队列
    - 数组节点: 遍历数组, 进行递归对比更新

  • 节点类型不一致
    创建新节点 : 进入新节点挂载流程(首次渲染)
    卸载旧节点:
    1. 文本节点、DOM节点、数组节点、空节点、函数组件节点: 直接放弃该节点,如果节点有子节点,递归卸载节点
    2. 类组件节点
    - 直接放弃该节点
    - 调用该节点的componentWillUnMount函数
    - 递归卸载子节点

没有找到对比目标

  • 创建新加入的节点
  • 卸载多余的节点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react-节点更新与销毁 的相关文章

随机推荐

  • 集合转换为Jsoin存入redis

    重温复习redis 要将对象集合存入redis作为缓存 上网找了个json串转集合的工具类 这里记录一下 import java io IOException import java util ArrayList import java u
  • js获取input上传文件的文件名和扩展名的方法

  • WLAN配置

    SW1 sysname SW1 修改名称 undo info center enable 关闭提示 vlan batch 100 to 102 批量创建vlan 100 101 102 interface GigabitEthernet0
  • Ethereum geth 同步区块的三种模式

    Ethereum 以太坊 当前交易多 截止当前 2018 02 04 已经有5029238个区块 区块大小在150G左右 如果全部同步 并且严格逐个验证 需要太多的时间和计算 作者曾经用一台实体机 8核 16GB内存 2TB机械硬盘的del
  • leetcode1921.消灭怪物的最大数量(中等)

    解法 排序 贪心 具体 计算出每个怪物到达城市的时间 然后排序 class Solution public int eliminateMaximum vector
  • 深度学习论文笔记(可解释性)——CAM与Grad-CAM

    文章目录 主要工作 Global Average Pooling的工作机制 CAM Grad CAM 主要工作 CAM与Grad CAM用于解释CNN模型 这两个算法均可得出 c l a s s
  • 【JVM】Java垃圾回收机制(GC)详解

    Java垃圾回收机制 GC 详解 一 为什么需要垃圾回收 如果不进行垃圾回收 内存迟早都会被消耗空 因为我们在不断的分配内存空间而不进行回收 除非内存无限大 我们可以任性的分配不回收 但是事实并非如此 所以 垃圾回收是必须的 二 哪些内存需
  • 【kali】kali环境下安装dvwa

    STEP1 从github下载dvwa git clone https github com ethicalhack3r DVWA Q 我要自己安装git吗 A kali不用啦 一般都自带有 但是普通的ubuntu和debian上是没有的哦
  • Eclipse4.3 swt 插件在线安装

    到eclipse官网下载swt插件 1 点击该网站主菜单 Downloads gt Project 在出现的插件列表中找到 WindowBuilder 并点击 出现如下网页 复制该链接地址 当然该网页讲的就是如何安装swt designer
  • MATLAB地理数据处理 25:植被物候提取及分析模型优化(Savitzky-Golay)

    物候提取模型优化 1 前提 2 MATLAB代码 1 前提 之前我写过一篇使用Savitzky Golay处理遥感数据 获取地面物候信息的MATLAB代码 Python地理数据处理 十七 植被物候提取和分析 Savitzky Golay 但
  • MySQL数据表的约束

    数据表约束 对于某一列的值能添加哪些内容做了一定的限制 这种限制的手段就称为约束 一 约束的类型 NOT NULL 指示某列不能存储 NULL 值 UNIQUE 保证某列的每行必须有唯一的值 DEFAULT 规定没有给列赋值时的默认值 PR
  • Visual Studio 2022编译CMake工程

    用VS2022打开CMakeLists txt文件所在的文件夹 配置缓存 生成完毕 选择启动项 调试启动 运行输出 进入CMake项目视图 启动参数设置 增加args
  • Dll 编程入门指南

    我正在 学习 DLLs 谈不上对其有什么高屋建瓴的见解 本文只是 通过 编码让你看到并想知道代码是如何运行的 在本文中 我假定你知道如何使用你的编译器特性 比如设置目录路径等等 为了建立项目 请选择Win32 控制台项目 Win32 Con
  • 飞机游戏初步

    步骤 1 创建 hellogame项目 tools gt cocos2d console gt bin gt shift 右键 gt 在此处打开命令窗口 gt 路径pythoncocos py new hellogame p com gam
  • 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5 7 8 开始支持的 在此之前 只能通过字符类型 CHAR VARCHAR 或 TEXT 来保存 JSON 文档 相对字符类型 原生的 JSON 类型具有以下优势 在插入时能自动校验文档是否满足 JSON
  • 【日志脱敏】Springboot集成日志框架脱敏实战

    针对日志打印而不能泄露用户隐私需求 需要利用相应日志框架实现脱敏 本文基于log4j logback 重写相应方法 匹配出正则并转换为脱敏后的日志 效果展示如下 name 李 idNumber 110106 226X mobile 130
  • Scala编译器的安装

    1 Scala编译器安装 1 1 安装JDK 因为Scala是运行在JVM平台上的 所以安装Scala之前要安装JDK 1 2 安装Scala 1 2 1 Windows安装Scala编译器 访问Scala官网http www scala
  • 两个有序数组合并成一个有序数组——C++实现

    程序分析 这里做的是升序 C 代码 include
  • 如何监控Android模拟器的HTTP访问情况

    前几个月 在调试某个应用时 需要监控应用与服务器之间的HTTP通讯 从搜索引擎找到的方案几乎全错 要么是人云亦云 要么是只能满足旧的平台版本 要么根本就是臆测 不得其解之际 用比较复杂的方法解决了 昨天想起来 觉得太过窝囊 于是重整旗鼓 终
  • react-节点更新与销毁

    文章目录 更新与销毁 节点更新 对比更新 找到了对比目标 没有找到对比目标 更新与销毁 发生更新的场景 重新调用ReactDOM render 触发根节点更新 在类组件中调用setState 会导致该节点更新 节点更新 分为两种 如果调用的