React diffing 算法如何比手动 DOM 操作更快?

问题描述 投票:0回答:1

我喜欢 React! 然而,我是在 React 出现之后才开始编程的,所以我从来没有真正拥有过在生产环境中使用 vanilla JS 开发应用程序的第一手经验。因此,当我沿着理解 React 为何被发明的道路前进时,我很好奇人们是否认为 React 比手动 dom 操作(普通方式)更快?我知道 React 使编码更不容易出错,并且具有可扩展性,但我无法理解实际的 dom 操作是否更快。

因为如果开发人员在某些事件上手动更新 DOM 节点,那么就没有理由将其与虚拟 DOM 进行比较。与虚拟 dom 的比较必须通过算法来完成。即使算法花费的时间很少,手动 dom 操作(无需比较任何内容)不是更快吗?

提前致谢,请原谅我的任何无知。我正在努力学习:)

reactjs performance rendering dom-manipulation
1个回答
0
投票

找到了我自己问题的答案。 React 基本上会进行批量更新,因此它实际上不仅仅是在发生状态更改调用时立即更新 DOM。因此,当我们调用 setState(..) 时,相关的 DOM 和状态不会立即更新,而是会排队。

当前执行块中的所有状态更改调用(例如,如果导致状态更改的交互是按钮单击,则为该 OnClick 事件触发的函数将是执行块),在该批次中排队。

之后,React 进入协调阶段,使用 diffing 算法将当前虚拟 dom 更改(包含突变)与之前的更改进行比较,然后找到需要更新的最小 DOM 节点集。协调步骤的一部分还包括检查这些状态更改对子自定义组件的影响。因此,算法在子组件上递归地执行相同的操作,最后当它遇到基本情况时,它会停止。

此时,我们更新的虚拟 dom 具有所有受影响的 dom 节点更改。最后一步是将更改更新到 Real DOM。

所以这个过程使得重新渲染非常有效。我们正在做最昂贵的操作,即最后的实际 DOM 操作,使用整个但最小的 DOM 节点集,这是可以完成的。

© www.soinside.com 2019 - 2024. All rights reserved.