当前位置: 首页 > news >正文

从节点重排看React 与 Vue3 的 Diff 算法

一个有趣的问题

之前我写了一篇狗教我 React——原理篇之 Diff 算法 - 掘金 (juejin.cn)简单介绍了 diff 算法,收到了一个有意思的疑问:

大佬讲得非常易懂,我有个疑惑就是都说 diff 处理节点前移比较差,比如 a→b→c→d 更新为 d→a→b→c,如果第一遍循环到第一个就截止了,把剩余旧的节点全放入剩余 map 中,第二次遍历不是都可以复用的吗,何来处理差这一说呢

这个问题看似简单,实则涉及到了 React diff 算法的细节,我在评论区简单回复了这个问题,但感觉还是不够详细,所以单独写一篇文章来详细解释一下。

示例中的更新流程是什么样的

首先,我们需要知道,React diff 算法是分两轮进行的,第一轮是处理节点复用,第二轮是处理节点重排。

如上面评论提到,第一次遍历时,第一个节点 key 不同,所以直接跳过,进行第二次遍历。

首先,我们来看一下更新流程是什么样的。

// 更新前
<ul><li key="a">a</li><li key="b">b</li><li key="c">c</li><li key="d">d</li>
</ul>
// 更新后
<ul><li key="d">d</li><li key="a">a</li><li key="b">b</li><li key="c">c</li>
</ul>

在这里插入图片描述

在第一轮遍历时,我们遇到第一个节点,发现 key 不同,所以直接跳过,进行第二轮遍历。

剩余的旧的 FiberNode 放入到一个 map 里:

在这里插入图片描述

http://www.xdnf.cn/news/113653.html

相关文章:

  • OpenBMC:BmcWeb login认证
  • C#中用 OxyPlot 在 WinForms 实现波形图可视化(附源码教程)
  • OpenCV 图形API(61)图像特征检测------检测图像边缘的函数Canny()
  • 认识游戏循环
  • 把dll模块注入到游戏进程的方法_插APC注入
  • 如何创建一个父类 Maven项目,然后在父类下再创建子项目,构建多模块 Maven 项目
  • Explain详解与索引最佳实践
  • day 32 学习笔记
  • 第七部分:向量数据库和索引策略
  • 【Pandas】pandas DataFrame pow
  • docker容器监控自动恢复
  • TKDE 2025年第3期研究热点与最新趋势
  • 中心极限定理(CLT)习题集 · 题目篇
  • 零基础上手Python数据分析 (22)案例实战]之利用 Matplotlib Seaborn 进行电商销售数据可视化分析
  • 罗伯·派克:Go语言创始者的极客人生
  • 人工智能与机器学习:二元分类决策树构建指南
  • Linux内核netlink机制 - 连接器(Netlink Connector)
  • ETL 数据集成都包含哪些?
  • 77. 组合
  • 【OpenGL with C++】1.使用CMake+GLFW+GLAD在Window搭建项目
  • Linux系统之----进程优先级、调度与切换
  • 基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案
  • MyBatis操作数据库---从入门到理解
  • Python爬虫第19节-动态渲染页面抓取之Splash使用下篇
  • centos7使用certbot完成nginx ssl证书续期
  • 最高支持高速L3商用,华为发布ADS 4智驾系统
  • 【OSG学习笔记】Day 8: 纹理贴图——赋予模型细节
  • MCU通信接口技术解析:UART、SPI与I2C
  • 【云计算】云计算中IaaS、PaaS、SaaS介绍
  • 基于 springboot+vue+elementui 的办公自动化系统设计(