key
属性:重用节点的关键栈协调机制下的Diff
算法,其实是树的深度优先遍历过程,也就是一个同步的递归过程,意味着一旦更新开始,根本停不下来。当处理复杂度高、体量大的虚拟DOM
树时,栈协调需要的调和时间会很长,意味着JavaScript 对主线程将长时间占用,进而导致渲染卡顿、无响应等问题
按照React
官方的说法,是实现增量渲染,换句话说就是把一个渲染任务分解为多个渲染任务,而后将其分散到多个帧里,是一种手段。
实现增量渲染的目的,是为了实现任务的可中断、可恢复,并给不同的任务赋予不同的优先级,最终达到快速响应的体验
可以看出,新老协调对生命周期的影响主要是 render 这个阶段,Fiber协调 通过增加 Scheduler
层 和 改写 Reconciler
层 实现将一个庞大的更新任务分解为一个个的工作单元,这些工作单元有着不同的优先级,React
可以根据优先级的高低去实现工作单元的打断和恢复
setState
并不是单纯 同步/异步,它的表现会因调用场景不同而不同:
setTimeout
、setInterval
等函数中,包括在 DOM
原生事件中,它都表现为同步造成这种差异的本质是:React 事务机制 和 批量更新机制 的 工作方