Skip to content

全局变量

根节点有关全局变量

workInProgressRootSkippedLanes

本次渲染访问过的组件留下的未处理更新,仅包含未处理的更新,不包括已跳过子树的工作。

类型 : Lane | Lanes

格式 : 0b0000b0000000000000000000000000000000

作用 : 缓存了当前渲染流程中跳过执行的 update 的 updateLane 。

添加时机

    1. useState 等hook在更新渲染阶段,执行 useState 时会计算当前 updateLane 下所有的 update,并在第一个非当前 updateLane 的 update 执行时,跳出 update 链表的执行,并将当前 updateLane 添加到 workInProgressRootSkippedLanes 中。
    1. useDefferedValue 在更新渲染阶段,如果存在高优先级 lane 的情况下,会在新旧值不同的情况下,生成一个 deferredLane添加到 workInProgressRootSkippedLanes 中。
js
function updateDeferredValueImpl<T>(hook: Hook, prevValue: T, value: T): T {
  // 判断是否需要延迟渲染
  const shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes);
  if (shouldDeferValue) {
    // 包含高优先级的 lane
    // 那么就判断新旧值是否发生变化
    if (!is(value, prevValue)) {
      // 如果值发生变化,就需要延迟渲染
      // 那么就需要创建一个新的 lane
      const deferredLane = claimNextTransitionLane();
      // 将新的 lane 添加到当前节点的 lanes 属性中
      currentlyRenderingFiber.lanes = mergeLanes(
        currentlyRenderingFiber.lanes,
        deferredLane
      );
      // 将新的 lane 添加到根节点 workInProgressRootSkippedLanes 属性中
      markSkippedUpdateLanes(deferredLane);
    }
    return prevValue;
  }
}

workInProgressRootIncludedLanes

"Included" lanes 指本次渲染期间处理过的 lanes。 与 renderLanes 略有不同,因为 renderLanes 在进入/退出 Offscreen 子树时会变化。 该值是整个渲染阶段所有 render lanes 的组合。