React 的 Diff 算法是怎么工作的?为什么性能很高?
✅ 一、什么是 diff 算法?
React 使用的是一种基于树的 diff 算法,通过比较新旧虚拟 DOM 树(Virtual DOM),计算出最小的 DOM 更新操作,来提升性能。它的核心目标是: 最小化实际 DOM 操作次数 + 避免不必要的重绘重排。
✅ 二、为什么它快?
🧩 1. 同级比较(只对比同一层级)
-
假设:DOM 节点跨层移动非常少。
-
所以只对比同一层级,不考虑跨层重排。
🔤 2. key 区分子节点(避免乱序)
-
如果不加
key
,React 会用 ” 位置索引 ” 对比,可能导致整组元素被删重建。 -
如果有
key
,可以精确判断哪些节点复用、插入、移动或删除。
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
📦 3. 组件级 diff(跳过重复渲染)
-
如果是同一组件类型(比如
<A />
→<A />
),React 会复用旧组件实例,只更新 props。 -
如果组件类型变了(比如
<A />
→<B />
),React 会销毁旧组件,挂载新组件。
✅ 三、实际中怎么触发 diff 优化?
实际开发中,我们通过以下方式配合 diff 提升效率:
- 给列表组件添加
key
属性,避免错误复用- 使用
React.memo
+useCallback
避免组件重复渲染- 拆分组件粒度,减少不必要的渲染范围
- 使用
shouldComponentUpdate
(类组件) 或React.memo
(函数组件)
🪄 举个例子(建议面试时加一句)
const items = ['a', 'b', 'c']
// 更新成 ['b', 'a', 'c'],没有 key 会重排两项,有 key React 只会移动元素
示例回答
React 的 diff 算法是一个高效的启发式算法,它在保证性能的前提下,通过同级比较、key 优化、组件复用等手段,极大减少了不必要的真实 DOM 操作,这也是 React 性能优秀的重要原因。