跳到主要内容

Vue和React的Diff算法区别

面试速答

  • 这题不要答成“谁更快”,重点是 Diff 思路和优化手段不同
  • React 的子节点协调更偏启发式单向遍历,依赖 key 做复用判断。
  • Vue 3 在编译期和运行时都做了更多针对性优化,尤其是带 key 子节点更新里常见的头尾预处理和最长递增子序列。

React 的 Diff 思路

1. 只做同层比较

React 默认不会跨层级去找“是不是同一个节点”,如果层级变了,通常按卸载旧节点、挂载新节点处理。

2. type 不同,通常直接替换

比如从:

<div />

变成:

<span />

通常会直接重建。

3. 列表主要依赖 key

React 在遍历子节点时会尽量顺序复用;遇到乱序时,会结合 key 建映射来判断:

  • 哪些可复用
  • 哪些需要移动
  • 哪些需要删除

它的目标是让常见 UI 更新足够快,而不是追求理论上的最小 DOM 操作数。

Vue 的 Diff 思路

1. Vue 3 更重视编译期信息

Vue 模板在编译阶段就能知道很多静态结构,因此运行时不必像 React 一样把很多情况都按“通用动态树”处理。

2. 带 key 子节点更新更激进

Vue 3 常见流程包括:

  • 头部相同先跳过
  • 尾部相同先跳过
  • 中间乱序部分建立映射
  • 用最长递增子序列减少移动次数

所以在复杂列表重排场景下,Vue 3 的 DOM 移动优化通常更精细。

两者差异怎么答

1. React 更偏通用调和

React 的重点不只是 DOM Diff,它还要服务于:

  • 函数组件重新执行
  • Fiber 调度
  • 可中断渲染

所以它的协调算法是整个渲染架构的一部分。

2. Vue 更偏模板编译优化

Vue 因为模板更强约束,能提前知道哪些节点静态、哪些块是动态,从而减少运行时 Diff 压力。

标准答法

问:React 和 Vue Diff 的本质区别是什么?

答:React 更偏基于 Fiber 的通用协调,依赖 key 和启发式规则在运行时做子树更新;Vue 3 则结合模板编译信息和更细的列表优化策略,在很多 DOM 更新场景下更精确地减少无效比较和移动。

问:为什么不能简单比较“谁更快”?

答:因为两者优化点不在同一层。React 关注的是整套调度和组件更新模型,Vue 更善于利用编译期静态信息优化运行时 patch。

易错点

  • 说成“React 用 Diff,Vue 不用 Diff”。
  • 把 Vue 3 的 LIS 优化强行套到 React 上。
  • 忽略 React 还有 Fiber 调度这一层目标。

速记要点

  • React:启发式协调,强调通用性和调度。
  • Vue 3:编译期信息更多,列表移动优化更细。
  • 别把这题答成简单跑分对比。