news 2026/7/19 13:32:39

Vue 2与Vue3.diff算法比对

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 2与Vue3.diff算法比对

本文聚焦Diff算法核心原理、执行步骤、核心源码实现与更新机制对比。

一、前置共识:Diff在整个更新机制中的位置

Vue的更新机制是一条完整链路,Diff只是其中一环,先把整条链路讲清楚:

数据变化 → 触发响应式通知 → 组件重新render → 生成新VNode树 → Diff对比新旧VNode → Patch更新真实DOM

核心原则:同层比较,不跨层。完整树对比复杂度O(n³)不可用,Vue和React都做了同层对比的工程妥协,将复杂度降至O(n)。Diff算法最复杂的场景,就是同层子节点列表的对比,这也是Vue2和Vue3差异最大的地方。


二、Vue2 Diff算法:双端比较法(双指针)

2.1 算法原理

Vue2采用双端比较策略,用四个指针分别指向新旧列表的首尾,每一轮优先对比两端的节点,命中则直接复用并移动指针;四次都没命中时,再用新列表头部节点去旧列表中遍历查找。

2.2 四个核心指针

旧列表:oldStartIdx → ... ← oldEndIdx 新列表:newStartIdx → ... ← newEndIdx

2.3 执行步骤(逐轮循环)

每一轮循环按以下顺序做4次比较:

第1次:旧头 vs 新头

  • 相同:两个头指针都后移一位,进入下一轮
  • 不同:继续下一次比较

第2次:旧尾 vs 新尾

  • 相同:两个尾指针都前移一位,进入下一轮
  • 不同:继续下一次比较

第3次:旧头 vs 新尾

  • 相同:旧头节点移动到旧尾后面,旧头指针后移,新尾指针前移
  • 不同:继续下一次比较

第4次:旧尾 vs 新头

  • 相同:旧尾节点移动到旧头前面,旧尾指针前移,新头指针后移
  • 不同:进入兜底查找

兜底:遍历查找

  • 拿新头节点的key,去旧列表中遍历找相同key的节点
  • 找到:把该节点移动到旧头前面,旧列表对应位置标记为null,新头指针后移
  • 没找到:新建节点插入到旧头前面,新头指针后移

循环终止条件:旧列表或新列表的头指针超过尾指针(有一方先遍历完)

收尾处理

  • 旧列表先走完:新列表剩余的节点全部新增
  • 新列表先走完:旧列表剩余的节点全部删除

2.4 流程图

<
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 13:32:24

TMS320F28003x EPWM XBAR寄存器配置与硬件保护实战

1. EPWM XBAR&#xff1a;实时控制系统的“信号交通枢纽”在嵌入式实时控制领域&#xff0c;尤其是电机驱动、数字电源和逆变器这类对时序和响应速度要求严苛的应用中&#xff0c;硬件保护机制的设计往往是决定系统成败的关键。想象一下&#xff0c;一个电机驱动器在运行中突然…

作者头像 李华
网站建设 2026/7/19 13:31:47

二本应用统计学好就业吗?毕业后能做哪些岗位?看这篇就够了

最近好几个大三大四的学弟学妹来问我&#xff1a;“学长&#xff0c;我当年志愿填报时听别人说统计学是‘万金油’专业&#xff0c;现在快毕业了感觉啥都会一点又啥都不精&#xff0c;二本应统出来到底能干啥&#xff1f; 投了十几份简历都没回音&#xff0c;心里慌得不行。”这…

作者头像 李华
网站建设 2026/7/19 13:31:26

Android APK签名自动化工具:专业开发者的7步高效签名实战指南

Android APK签名自动化工具&#xff1a;专业开发者的7步高效签名实战指南 【免费下载链接】uber-apk-signer A cli tool that helps signing and zip aligning single or multiple Android application packages (APKs) with either debug or provided release certificates. I…

作者头像 李华
网站建设 2026/7/19 13:31:04

Formsmd表单提交处理最佳实践:安全与性能优化策略

Formsmd表单提交处理最佳实践&#xff1a;安全与性能优化策略 【免费下载链接】formsmd Developer-first, open source Typeform alternative (formerly known as Blocks.md) 项目地址: https://gitcode.com/gh_mirrors/fo/formsmd Formsmd作为一款面向开发者的开源表单…

作者头像 李华
网站建设 2026/7/19 13:30:30

猫抓浏览器扩展:解锁网页媒体资源的终极利器

猫抓浏览器扩展&#xff1a;解锁网页媒体资源的终极利器 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今网络世界中&#xff0c;视频、音频和…

作者头像 李华