面试题
React Lane是什么?

react的lane是什么,有什么用?

在目前的源码中,存在有三套优先级:

  • React Event的优先级;
  • Lane模型的优先级,主要应用于React内部;
  • scheduler包里面的优先级。

React中使用二进制来表示优先级,这个二进制只有1位为1,其余全为0,这个1就表示优先级的所在,位越小(越靠右)表示优先级越高。 优先级的运算(合并优先级、拆分优先级等)采用位运算的方式。多个Lane就组合成了Lanes,Lanes表示一批任务的优先级。

同步更新的优先级,优先级最高,表示连续的优先级 比如滚动、拖拽,次高,默认优先级第三用户阻塞的优先级,就这样。

React Event优先级和Lane模型优先级是两套优先级,但是用的是一套优先级值,这个值就是ReactFiberLane里面定义的Lane相关的值。 React的事件优先级为什么不直接使用Lane呢?我觉得可能是为了不与Lane机制耦合,后面事件优先级有什么变动的话,可以直接修改而不会影响到Lane。

// /** @noinline */ concurrent模式
// 每帧都会执行一次
function workLoopConcurrent() {
  // 通过shouldYield() 方法来判断当前构建fiber 树的执行过程是否超时,为false说明超时了?
  while (workInProgress !== null && !shouldYield()) {
    performUnitOfWork(workInProgress);
  }
}
 
// /** @noinline */ 同步模式
function workLoopSync() {
  // Already timed out, so perform work without checking if we need to yield.
  while (workInProgress !== null) {
    performUnitOfWork(workInProgress);
  }
}

workInProgressRootRenderLanes是在任务执行阶段赋予的需要更新的fiber节点上的lane的值, ,当新的更新任务产生时,workInProgressRootRenderLanes不为空,则表示有任务正在执行 ,那么则直接返回这个正在执行的任务的lane,那么当前新的任务则会和现有的任务进行一次批量更新 ,接着会调用scheduleUpdateOnFiber,做好调度任务前的准备, 检查是否做了无限循环更新,比如:在render函数中调用了setState,如果是则会报错提示,

  • 收集需要更新的子节点的lane,存放在父fiber上的childLanes上
  • 更新当前fiber节点的lannes,表示当前节点需要更新
  • 从当前需要更新的fiber节点向上遍历,遍历到根节点(root fiber)并更新每个fiber节点上的childLanes属性
  • childLanes有值表示当前节点下有子节点需要更新
  • 在之后会通过childLanes来判断当前fiber节点下是否有子节点需要更新