Published on

fiber lane 渲染流程参与

Authors
  • avatar
    Name
    李丹秋
    Twitter
function enqueueUpdate(
  fiber: Fiber,
  queue: ConcurrentQueue | null,
  update: ConcurrentUpdate | null,
  lane: Lane,
) {
  concurrentQueues[concurrentQueuesIndex++] = fiber;
  concurrentQueues[concurrentQueuesIndex++] = queue;
  concurrentQueues[concurrentQueuesIndex++] = update;
  concurrentQueues[concurrentQueuesIndex++] = lane;

  concurrentlyUpdatedLanes = mergeLanes(concurrentlyUpdatedLanes, lane);

  // 优先级在enqueueUpdate函数中,被标记在fiber上,即更新优先级和更新的fiber是一一对应的
  fiber.lanes = mergeLanes(fiber.lanes, lane);
  const alternate = fiber.alternate;
  if (alternate !== null) {
    alternate.lanes = mergeLanes(alternate.lanes, lane);
  }
}
renderRootConcurrent| renderRootSync  -> markUpdateLaneFromFiberToRoot

先完成childLane的更新,然后再执行调和。调和的时候,会根据childLane的优先级,来决定是否执行调和。


在后续的更新过程中,会执行bailoutOnAlreadyFinishedWork, 会根据lane来判断是否需要跳过这个fiber的更新。