React 使用一种称为 “Reconciliation” 的过程来确定虚拟 DOM 树中的哪些部分发生了变化,从而最小化实际 DOM 更新的工作量。这个过程的核心是实现了一个高效的 diff 算法,通常被称为“Fiber”机制的一部分。虽然它并不完全等同于经典的 diff 算法(如 Myers’ diff algorithm 或 Hunt-McIlroy algorithm),但其目标是相似的:找出两个树结构之间的差异。
简单说明
-
虚拟 DOM:
- React 保持一个应用的虚拟表示(虚拟 DOM),这是一个内存中的对象树,它与浏览器的 DOM 树相对应。
- 当状态或属性改变时,React 会重新渲染整个组件树到内存中的虚拟 DOM。
-
Diff 算法:
- 当新的虚拟 DOM 生成后,React 会比较新旧虚拟 DOM 树之间的差异。
- React 使用一种优化过的 diff 算法,它不是递归地比较所有节点,而是采取了一种更简单的方法,只比较同一级别的节点。
-
最小化工作量:
- React 假定两个不同类型的元素会产生不同的树,因此它不会尝试去比较它们,而是直接替换。
- 对于相同类型的元素,React 会比较它们的属性和子元素。
- React 通过标记和优先级系统(即 Fiber 机制)来安排和优化更新任务。
-
实际 DOM 更新:
- 一旦确定了需要进行的实际 DOM 更新,React 将批量执行这些变更,以减少页面重绘次数,从而提高性能。
- React 会尽量复用已有的 DOM 节点而不是创建新的节点,这样可以减少 DOM 操作带来的开销。
Fiber 机制
Fiber 是 React 16 引入的新架构,它改变了 React 处理更新的方式。Fiber 节点是虚拟 DOM 节点的一个抽象表示,它允许 React 将工作分割成离散的单元,并且可以暂停和恢复这些工作单元。这样,即使在复杂的更新过程中,React 也能保证用户界面的响应性。
总之,React 的 diff 算法通过比较虚拟 DOM 树来确定实际 DOM 需要更新的部分,从而提高了应用程序的性能。这种算法依赖于一些关键假设,使得它能够在大多数情况下高效地工作。
标签:Fiber,DOM,React,算法,虚拟,diff From: https://blog.csdn.net/ivan5277/article/details/142062459