React 协调

1、分层对比:改变时间复杂度的决定性思路

2、类型一致:减少递归“一刀切”策略

3、key属性:重用节点的关键

二、无解的问题

栈协调机制下的Diff算法,其实是树的深度优先遍历过程,也就是一个同步的递归过程,意味着一旦更新开始,根本停不下来。当处理复杂度高、体量大的虚拟DOM树时,栈协调需要的调和时间会很长,意味着JavaScript 对主线程将长时间占用,进而导致渲染卡顿、无响应等问题

三、Fiber协调

按照React官方的说法,是实现增量渲染,换句话说就是把一个渲染任务分解为多个渲染任务,而后将其分散到多个帧里,是一种手段。

实现增量渲染的目的,是为了实现任务的可中断、可恢复,并给不同的任务赋予不同的优先级,最终达到快速响应的体验

可以看出,新老协调对生命周期的影响主要是 render 这个阶段,Fiber协调 通过增加 Scheduler 层 和 改写 Reconciler层 实现将一个庞大的更新任务分解为一个个的工作单元,这些工作单元有着不同的优先级,React 可以根据优先级的高低去实现工作单元的打断和恢复

四、setState

setState并不是单纯 同步/异步,它的表现会因调用场景不同而不同:

  • 在 React 钩子函数及合成事件中,它表现为异步
  • 而在 setTimeoutsetInterval 等函数中,包括在 DOM 原生事件中,它都表现为同步

造成这种差异的本质是:React 事务机制 和 批量更新机制 的 工作方