返回 blog
2023年12月04日
1 分钟阅读

React fiber 是如何设置sibling的?

Fiber过程

下探时,如果发现子节点是个数组,会从第一个子节点开始,链表形式给每个子节点设置sibling,同时也把每个遍历到的节点都fiber化了

if (isArray(newChild)) {
  return reconcileChildrenArray(
    returnFiber,
    currentFirstChild,
    newChild,
    lanes,
  );
}

...

for (; newIdx < newChildren.length; newIdx++) {
    const newFiber = createChild(returnFiber, newChildren[newIdx], lanes);
    if (newFiber === null) {
      continue;
    }
    lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
    if (previousNewFiber === null) {
      // 此时是第一个子节点,需要返回给return
      // TODO: Move out of the loop. This only happens for the first run.
      resultingFirstChild = newFiber;
    } else {
      // 给前一个fiber设置sibling
      previousNewFiber.sibling = newFiber;
    }
    // 指针右移
    previousNewFiber = newFiber;
}

resultingFirstChild 很重要,他是链表头,这个对象里面包含了同为子节点的所有sibling,比如,有这样一个结构:

const A = () => {

  return <div>
    <span>1</span> // 这个就是resultingFirstChild
    <span>2</span>
    <span>3</span>
  </div>
}

1 被递归处理为fiber的时候,会去把 2,3 都处理成fiber 然后 1 的 sibling 2, 2 的 sibling 是 3 这些信息都存在 resultingFirstChild 中(因为它是指针头)