Reconciler, Commit

在 React 的渲染流程中,Reconciler(协调器)阶段和 Commit(提交)阶段是两个关键的步骤,下面为你详细介绍这两个阶段的具体工作内容。

Reconciler 阶段

Reconciler 阶段主要负责找出需要更新的部分,也就是进行虚拟 DOM 的比较(Diff),并生成新的 Fiber 树。这个阶段是可中断的,支持 React 的并发模式,有助于提高应用的响应性能。具体工作如下:

  • 创建或更新 Fiber 节点
    • React 会根据组件的类型(函数组件、类组件、原生 DOM 组件等)创建或更新对应的 Fiber 节点。每个 Fiber 节点代表一个组件实例或 DOM 元素,包含了组件的状态、属性等信息。
    • 例如,当一个函数组件被渲染时,Reconciler 会为其创建一个 Fiber 节点,并将组件的 props 等信息存储在该节点上。
  • Diff 算法执行
    • Reconciler 使用 Diff 算法比较新旧 Fiber 树,找出需要更新、添加或删除的节点。Diff 算法的核心原则是通过对比节点的 key、类型等信息,尽可能复用已有的节点,减少不必要的 DOM 操作。
    • 例如,当一个列表组件的某些项发生变化时,Reconciler 会根据项的 key 来判断哪些项是新增的、哪些项是需要更新的、哪些项是需要删除的。
  • 生成副作用标记
    • 在比较过程中,Reconciler 会为需要进行 DOM 操作的节点添加副作用标记(Side Effect Tag),如插入(Placement)、更新(Update)、删除(Deletion)等。这些标记会在后续的 Commit 阶段被使用。
    • 例如,如果一个新的 DOM 元素需要被插入到页面中,对应的 Fiber 节点会被标记为 Placement。
  • 可中断与调度
    • Reconciler 阶段是可中断的,React 会根据浏览器的剩余时间来决定是否暂停当前的工作,将控制权交还给浏览器,以避免长时间阻塞主线程,保证页面的流畅性。
    • 例如,当浏览器有更高优先级的任务(如用户交互)时,Reconciler 会暂停工作,等浏览器空闲时再继续。

Commit 阶段

Commit 阶段是将 Reconciler 阶段生成的副作用标记应用到真实 DOM 上,并执行一些副作用操作的阶段。这个阶段是同步的,一旦开始就会一直执行直到完成。具体工作如下:

  • BeforeMutation 阶段(DOM 更新前)
    • 执行一些 DOM 更新前的操作,比如调用 useEffect 的清理函数。如果在之前的渲染中使用了 useEffect 并返回了一个清理函数,那么在这个阶段会执行该清理函数,用于清理上一次副作用产生的影响。
    • 例如,当一个组件卸载时,其 useEffect 的清理函数会在这个阶段被调用,以清除定时器、取消网络请求等。
  • Mutation 阶段(DOM 更新)
    • 根据 Reconciler 阶段生成的副作用标记,对真实 DOM 进行插入、更新、删除等操作。将新的 Fiber 树的状态和属性同步到真实的 DOM 上。
    • 例如,如果某个 Fiber 节点被标记为 Placement,那么在这个阶段会将对应的 DOM 元素插入到页面中;如果被标记为 Update,会更新该 DOM 元素的属性和内容。
  • Layout 阶段(DOM 更新后)
    • 执行一些 DOM 更新后的操作,比如调用 useLayoutEffect 的回调函数。useLayoutEffect 会在 DOM 更新后立即同步执行,适合进行一些需要读取最新 DOM 布局信息的操作。
    • 例如,可以在 useLayoutEffect 中获取更新后的 DOM 元素的宽度、高度等信息。
    • 同时,在这个阶段会更新组件的 refs,确保 refs 引用到最新的 DOM 元素。
  • 调度 useEffect
    • 在 Layout 阶段完成后,React 会调度 useEffect 的回调函数。useEffect 的回调函数会在浏览器完成渲染后异步执行,用于处理一些副作用,如数据获取、订阅等。
    • 例如,在组件渲染完成后,可以使用 useEffect 发起一个网络请求来获取数据。

综上所述,Reconciler 阶段主要负责找出需要更新的部分,而 Commit 阶段则负责将这些更新应用到真实 DOM 上,并执行相关的副作用操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值