react的diff算法

news/2025/10/24 20:46:17/文章来源:https://www.cnblogs.com/meme-/p/19164196

这个算法用来比较虚拟dom和真实dom,从而最小化真实dom的更新

本质上是对两颗Fiber树的对比
(在Vue中是对旧VDOM树与新VDOM树的对比)

在不剪枝的情况下,时间复杂度接近O(n^3)

基于最长公共子序列 (LCS) 的朴素计算为O(n2),加上需要递归比较子节点,时间复杂度来到O(n3)

diff的限制:

  1. 只进行同层级比较
  2. 新旧节点的type不同直接删除旧节点,创建新节点
  3. 通过 key 来复用节点

三个层级的比较策略

  1. 第一步剪枝,Tree层级的比较
    每次递归开始的第一步,比较两棵树的根节点,不一样直接销毁整棵树重建
  2. Component层级
    type同 => 保持组件实例不变只更新props,然后进入组件的render结果进行Element层级的比较
    type不同 => 销毁重建
  3. Element层级
    type同 => 更新属性
    type不同 => 销毁重建

diff算法

根据fiber节点的child类型判断是单节点diff还是多节点diff,仅当child类型为数组时进行多节点diff

1. 单节点diff

key同 且 type不同 => 执行 deleteRemainingChildren 将 child 及其兄弟 fiber 都标记删除。
key不同 => 将child标记删除,然后遍历兄弟fiber

在 React 中,一个 Fiber 节点(即组件实例)的状态(State)和 Hooks(如 useState, useEffect)是严格绑定在它的 type 上的。让一个不再渲染的旧组件 Fiber 保持 Hooks 激活状态是错误的,会导致内存泄漏和不可预测的行为,必须立即销毁重建。

2.多节点diff

两轮遍历

1. 第一轮

key同 type同可复用
key 不同导致不可复用,立即跳出整个遍历,第一轮遍历结束。
key 相同 而type 不同导致不可复用,会将 oldFiber 标记为 DELETION,并继续遍历
newChildren和oldFiber其一遍历完成就跳出

2. 第二轮

  1. newChildren 与 oldFiber 同时遍历完
    只需在第一轮遍历进行组件更新。此时 Diff 结束。

  2. newChildren 没遍历完,oldFiber 遍历完
    遍历剩下的 newChildren 为生成的 fiber 依次标记 Placement。

  3. newChildren 遍历完,oldFiber 没遍历完
    遍历剩下的 oldFiber,依次标记 Deletion。

  4. newChildren 与 oldFiber 都没遍历完
    处理移动的节点

react会把剩余的旧 Fiber 及其在旧列表中的索引存入一个 Map 中
每个新节点有两个index,oldIndex 和 maxIndex,
oldIndex:新节点在 Map 中查找对应的旧 Fiber,得到它在旧列表中的原始索引。
maxIndex: 记录当前遇到的所有旧节点中的最大原始索引。

当 oldIndex>maxIndex 时,将 oldIndex 的值赋值给 maxIndex
当 oldIndex=maxIndex 时,不操作
当 oldIndex<maxIndex 时,将当前节点移动到 index 的位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM学习记录DAY11

📘今日学习总结 tokenization分词算法 BPE分词(Byte-Pair Encoding)BPE 算法从一组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元,并将它们替换为新的词元,这一过程被称为合并。 合并的…

ABP - 当前用户 [ICurrentUser、CurrentUser]

当前用户(Current User) 核心辅助类:ICurrentUser:获取当前登录用户信息(ID、用户名、角色等)。 CurrentUser:静态快捷访问(需在请求上下文内)。在ABP框架中,ICurrentUser和CurrentUser用于获取当前登录用户…

轮次检测模型 VoTurn-80M 开源,多模态融合架构;OpenAI 收购桌面助手 Sky:实时识别屏幕自然语言交互丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度…

ABP - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

ABP vNext 框架功能模块 - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

SAP维护汇率的关键Tcode

Tcode: OB08 维护汇率Tcode:OBBS 维护汇率的折算比率☆ No matter how much you change, you still have to pay the price for the things youve done.

幂函数

观察幂函数图像结论: 所有的幂函数都过1,1点,幂函数在第一象限必有图像。 a为负数时,不过0,0点,其余都有0,0点。 一、画函数用结论,a<0,单调递减,a>0,单调递增。 二、0<a<1之间,增的缓,a>1,…

ABP vNext 框架功能模块 - 动态API(Dynamic API)[RemoteServiceAttribute | DynamicApiControllerBuilder]

动态API(Dynamic API) 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteService…

第4天(中等题 滑动窗口、哈希表)

打卡第四天 两道中等题哈希表记录元素频率:哈希表程序表示:滑动窗口+哈希表优化算法耗时≈一小时 明天继续 小tips:不小心删除可以用 Ctrl+Z 撤回刚刚消除的代码/文字

ABP vNext 框架功能模块 - 动态API(Dynamic API)

** 动态API(Dynamic API)** 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteSe…

ABP vNext 框架功能模块 - 模块化(Modularity)

模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块依赖关系。 ModuleInitializer:模块初始化器(自动生成)。 IModuleContainer:模块容器,用于运…

ABP vNext 框架功能模块

以下是ABP框架中各核心功能的辅助类及示例说明,涵盖模块化、依赖注入、ORM集成等关键特性: 一. 模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块…

题解:P14299 [JOI2023 预选赛 R2] 填充 / Painting

\(\displaystyle \large {题目传送门}\) 题面 给定一个一个 H*W 的矩形 , 每个坐标上有一个颜色 , 上下左右相邻的同颜色节点可以形成连通块 。 你可以对任意一个连通块 , 进行一次并仅有一次的染色 , 求新形成的连…

Devolutions Server权限提升漏洞分析与修复指南

本文详细分析了CVE-2025-11957漏洞,该漏洞存在于Devolutions Server 2025.2.12.0及更早版本中,由于临时访问工作流程的授权机制存在缺陷,允许经过身份验证的基本用户通过精心构造的API请求自我批准或批准其他用户的…

AI股票预测分析报告 - 2025年10月24日 - 20:08:50

AI股票预测分析报告 - 2025年10月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1…

在 Astro 博客中优雅使用 51.la 统计数据

在 Astro 博客中使用 51.la 免费流量统计,通过解析 widget JS 自行渲染访问数据,既保留统计功能,又可自定义展示,让你直观了解博客访客情况作为老牌网站流量统计服务商,51.la 提供每月高达 1000 万次的免费统计额…

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)

申威服务器安装Java11(swjdk-11u-9.ky10.sw_64.rpm)详细操作步骤(附安装包)​这是申威架构(国产芯片,常见于Kylin V10等国产系统)专用的 ​Java 11 版本(RPM安装包)​,包名为 java-11.0.7-swjdk-11u-9.ky10.…

str.endswith() 类似的方法

在Python中,与str.endswith()类似的方法(主要涉及字符串的开头/结尾检查、子串搜索等)有很多,以下是核心方法及其功能对比: 1. 开头检查:str.startswith()功能:检查字符串是否以指定前缀开头,返回True/False。…

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…