乐闻世界logo
搜索文章和话题

React 的调和阶段, setState内部做了哪些动作?

浏览11
6月24日 16:43

在React中,setState 函数用于更新组件的状态,并触发重新渲染流程。调和(Reconciliation)阶段是React用来对比新旧虚拟DOM树差异,并决定如何高效更新真实DOM的过程。当你调用 setState 时,内部会触发以下动作:

  1. 排队状态更新(Enqueuing State Update): setState 调用并不会立即更新组件的状态,而是将状态更新排队。这意味着React可能会累积多个 setState 调用,然后批量更新状态以优化性能。

  2. 标记组件需要更新(Marking Component for Update): 一旦状态被置入队列,React会将当前组件标记为“脏”(dirty),意味着组件的状态与显示的输出不同步,需要进行更新。

  3. 批处理和合并状态(Batching and Merging State): React会将所有排队的 setState 调用进行批处理。如果有多个状态更新,React会将它们合并以减少不必要的渲染和调和操作。

  4. 调用生命周期方法(Lifecycle Methods Invoking): 在实际更新之前,React会调用 componentWillUpdate(在旧版本的React中)或 getDerivedStateFromPropsshouldComponentUpdate(在新版本中),这些生命周期方法允许开发者在渲染发生前执行额外的操作。

  5. 创建新的虚拟DOM树(Virtual DOM Tree Creation): 有了新的状态,React会创建新的虚拟DOM树,这个树反映了状态更新后的组件结构。

  6. 对比新旧虚拟DOM(Diffing Virtual DOM Trees): 接下来,React会使用调和算法对比新旧虚拟DOM树,确定哪些部分需要更新。这个过程产生了所谓的“差异”(diffs)。

  7. 生成更新操作(Generating Update Operations): 根据差异,React会生成一系列更新操作,这些操作将被应用到真实的DOM上以实现UI的最终变化。

  8. 执行更新操作(Executing Update Operations): React会按照效率最高的方式批量执行这些更新操作,这可能包括添加、移动、更新或删除DOM节点。

  9. 调用生命周期方法(Lifecycle Methods Invoking): 在更新操作完成之后,React会调用 componentDidUpdate 生命周期方法,使开发者有机会执行需要DOM更新后才能进行的操作。

例如,假设我们有一个计数器组件,其中包含一个按钮,当点击按钮时,它会通过 setState 增加计数值。React将按照上述步骤进行操作,确保界面反映了最新的计数状态,并以最高效的方式更新DOM。

请注意,从React 16开始,引入了Fiber架构,它改变了内部工作原理,特别是更新过程可以被中断和恢复,以便更好地管理UI渲染的性能。但是,以上所述的基本步骤仍然适用。

标签:React前端