画布 1
updateContainer
  requestEventTime
  requestUpdateLane
  createUpdate(eventTime, lane)
    创建更新对象给 enqueueUpdate 使用
  enqueueUpdate(current, update)
    形成环状链表
  scheduleUpdateOnFiber(current, lane, eventTime)
    同步 render: legacy 模式
      markUpdateLaneFromFiberToRoot
        得到 root Fiber
      非批量更新且尚未渲染
        performSyncWorkOnRoot
          flushPassiveEffects
          renderRootSync
            workLoopSync
              performUnitOfWork
                beginWork
                completeUnitOfWork
          commitRoot
      批量更新或已经渲染
        ensureRootIsScheduled
          同步任务
            performSyncWorkOnRoot
          批量任务
            performSyncWorkOnRoot
          其余任务
            performConcurrentWorkOnRoot
        如果异步中批量更新
          executionContext === NoContext
            flushSyncCallbackQueue
    非同步 render: concurrent 模式
      markUpdateLaneFromFiberToRoot
      ensureRootIsScheduled
      flushSyncCallbackQueue()
1、eventTime
任务时间，通过 performance.now() 获取的毫秒数
2、lane
优先级相关字段
3、tag
更新的类型，包括 UpdateState | ReplaceState | ForceUpdate | CaptureUpdate
更新挂载的数据。不同类型组件挂载的数据不同：
4、payload: null,
更新的回调函数。不同类型组件挂载的数据不同：
对于 ClassComponent，payload 为 this.setState 的第一个传参。
对于 HostRoot，payload 为 ReactDOM.render 的第一个传参。
5、callback: null,
对于 ClassComponent，callback 为 this.setState 的第二个传参。
对于 HostRoot，callback 为 ReactDOM.render 的第三个传参。
6、next: null,
与其他 Update 连接形成链表
1、eventTime
任务时间，通过 performance.now() 获取的毫秒数
2、lane
优先级相关字段
3、tag
更新的类型，包括 UpdateState | ReplaceState | ForceUpdate | CaptureUpdate
更新挂载的数据。不同类型组件挂载的数据不同：
4、payload: null,
更新的回调函数。不同类型组件挂载的数据不同：
对于 ClassComponent，payload 为 this.setState 的第一个传参。
对于 HostRoot，payload 为 ReactDOM.render 的第一个传参。
5、callback: null,
对于 ClassComponent，callback 为 this.setState 的第二个传参。
对于 HostRoot，callback 为 ReactDOM.render 的第三个传参。
6、next: null,
与其他 Update 连接形成链表
形成环状链表
const pending = current.updateQueue.shared
update.next = pending.next;
pending.next = update;
const pending = current.updateQueue.shared
update.next = pending.next;
pending.next = update;
function workLoopSync() {
// Already timed out, so perform work without checking if we need to yield.
while (workInProgress !== null) {
// == 执行每个工作单元
performUnitOfWork(workInProgress);
}
}
以首次渲染更新函数组件为例
1、返回下一个工作单元：即第一个子节点 workInProgress.child
2、通过 current.child.sibling 处理了所有的子节点
3、每个子节点的 return 属性均指向父节点 current
1、setTimeout 中执行 setState
2、导致 batchedUpdates 中 executionContext 为 null