当前位置: 首页 > 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.dtcms.com/a/152580.html

相关文章:

  • 1、AI及LLM基础:Python语法入门教程
  • 【Pandas】pandas DataFrame pow
  • 实时数字人——DH_LIVE
  • 使用Qt Quick Controls创建自定义日历组件
  • SCADA系统:工业自动化与智能管控的核心架构
  • 从工作到娱乐:Codigger Desktop 让桌面环境更智能
  • Java并发编程 - ReentrantLock
  • 运维打铁:Centos 7 安装 redis_exporter 1.3.5
  • Vue 3 相比 Vue 2 的优势
  • 开发 MCP Proxy(代理)也可以用 Solon AI MCP 哟!
  • Netty线上如何做性能调优?
  • 弄清C语言中的链表
  • FPGA上实现YOLOv5的一般过程
  • STM32 的 GPIO和中断
  • 基于深度学习和单目测距的前车防撞及车道偏离预警系统
  • git 操作
  • STM32 串口通信
  • Git 详细使用说明文档(适合小白)
  • MVCC详解
  • maven工程中引入外部jar
  • 信息系统项目管理工程师备考计算类真题讲解八
  • 拥抱健康生活,解锁养生之道
  • Trae或者VsCode无法识别相对路径(不自动切换工作目录)
  • VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘
  • C# 音频分离(MP3伴奏)
  • WHAT - 区分 Git PR 和 MR
  • 使用setGraphicsEffect重新设置阴影导致程序崩溃的问题
  • IP的基础知识以及相关机制
  • QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信
  • 爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取