React16 支持异步可中断更新,可以通过 React Fiber 架构实现。React Fiber 通过将渲染工作分成一小段一小段的单元,形成一个纤程链,可以在任意时刻中断、恢复和优先执行某些任务来提高渲染效率。
React Fiber 架构包含以下概念:
- Fiber:每一个 Component 在 React Fiber 中都有一个对应的 Fiber 对象,Fiber 对象中保存了该 Component 的状态和对应的 DOM 节点信息,以及协调更新的信息。
- Scheduler:React Fiber 的调度器,负责协调总体的渲染进度,以及管理 Fiber 的执行顺序。
- WorkInProgress(WIP):表示正在进行的任务,在 React Fiber 中表现为一个 Fiber 的链表。Scheduler 会不断从 WIP 链表中取出一个任务进行执行,直到任务执行完毕,或者优先级变更,需要重新调度。
- FiberRoot:表示整个渲染树的根节点,每个 FiberRoot 对象都会有一个对应的 WIP 链表以及 Scheduler。
异步可中断渲染的实现流程如下:
- 在组件内部,通过调用 scheduleWork 函数向 Scheduler 中添加一项工作。
- Scheduler 将新添加的工作创建为一个 Fiber 对象,加入对应 WIP 链表中。
- Scheduler 根据一定的调度策略,从 WIP 链表中选择一个任务进行执行,并将该任务标记为正在执行状态。
- 当前任务需要中断时,Scheduler 会暂停当前任务的执行,将当前任务的 Fiber 对象标记为未完成状态,并将该任务放回 WIP 链表末尾,等待后续调度重新执行。
- 当有更高优先级的任务需要执行时,Scheduler 会优先执行该任务,即将更高优先级的任务插入到 WIP 链表的头部,等待下一次调度。
- 当任务执行完毕后,Scheduler 标记该任务为已完成状态,并将 WIP 链表头部的任务取出进行执行,循环执行以上流程直到 WIP 链表为空。