10 | React 15中的“栈调和”和diff

调和(Reconciliation)过程与 Diff 算法

Virtual DOM 是一种编程概念。在这个概念里,UI 以一种理想化的,或者说“虚拟的”表现形式被保存于内存中,并通过如 ReactDOM 等类库使之与“真实的” DOM 同步。这一过程叫作协调(调和)。

  通过如 ReactDOM 等类库使虚拟 DOM 与“真实的” DOM 同步,这一过程叫作协调(调和)。说人话:调和指的是将虚拟 DOM映射到真实 DOM 的过程。因此严格来说,调和过程并不能和 Diff 画等号。调和是“使一致”的过程,而 Diff 是“找不同”的过程,它只是“使一致”过程中的一个环节。调和器所做的工作是一系列的,包括组件的挂载、卸载、更新等过程,其中更新过程涉及对 Diff 算法的调用。

  因为Diff 确实是调和过程中最具代表性的一环:根据 Diff 实现形式的不同,调和过程被划分为了以 React 15 为代表的“栈调和”以及 React 16 以来的“Fiber 调和”。

Diff 策略的设计思想

  1. Diff 算法性能突破的关键点在于“分层对比”;
  2. 类型一致的节点才有继续 Diff 的必要性;
  3. key 属性的设置,可以帮我们尽可能重用同一层级内的节点。

Diff 算法性能突破的关键点在于“分层对比”

销毁 + 重建的代价是昂贵的,因此 React 官方也建议开发者不要做跨层级的操作,尽量保持 DOM 结构的稳定性。

减少递归的“一刀切”策略:类型的一致性决定递归的必要性

React 认为,只有同类型的组件,才有进一步对比的必要性;若参与 Diff 的两个组件类型不同,那么直接放弃比较,原地替换掉旧的节点。这样一来,便能够从很大程度上减少 Diff 过程中冗余的递归操作。

重用节点的好帮手:key 属性帮 React “记住”节点

key 是用来帮助 React 识别哪些内容被更改、添加或者删除。key 需要写在用数组渲染出来的元素内部,并且需要赋予其一个稳定的值。

posted @ 2022-12-29 18:17  哥哦狗子  阅读(57)  评论(0编辑  收藏  举报