美文网首页
React 18 源代码学习 11 completeUnitOf

React 18 源代码学习 11 completeUnitOf

作者: 吴摩西 | 来源:发表于2022-09-13 19:39 被阅读0次

    workLoopSync 中会递归调用 performUnitOfWork,虽然看起来下述代码是一个循环,应该是 react 防止调用栈过深,难以中断而进行了拉平。 performUnitOfwork 会持续调用某个节点的 childsibling 知道所有的子节点 生成以后,进入到此节点的
    completeUnitOfWork

    function workLoopSync() {
        // Perform work without checking if we need to yield between fiber.
        if (workInProgressIsSuspended && workInProgress !== null) {
          // The current work-in-progress was already attempted. We need to unwind
          // it before we continue the normal work loop.
          resumeSuspendedUnitOfWork(workInProgress);
        }
    
        while (workInProgress !== null) {
          performUnitOfWork(workInProgress);
        }
      }
    

    completeUnitOfWork

    completeUnitOfWork 是一个循环调用,持续向上 completeUnitOfWork,只到某个节点尚未 beginWork。

    对于 HostComponent(5)

    1. popHostContext
      弹出 fiberStack, React 应该是将递归向下的 fiber 。具体结构如下,
      Screen Shot 2022-09-10 at 21.21.34.png

    本例中,实际 DOM 深度只有两层。fiberStack 中却有8层,前6个 fiber 都相同,即是 HostRoot(3),后两个都相同,即是 HostComponent(5)

    1. createInstance
      主要执行 domElement = ownerDocument.createElement(type),通过 document.createElement 创建对应的 DOM 节点。

    2. precacheFiberNode
      React 开始渲染时,会生成一个随机字符串,precacheFiberNode 会将 fiber 存储在
      对应的 DOM 中的 __reactFiber$xxxxxxxxxxxxxxxxxxxx 是一个10位的随机字符串。

    3. updateFiberProps
      element 对应的 props 也会存储在 DOM 中的 __reactProps$xxxxxxxxxx 中。

    4. appendAllChildren
      将此节点所有的子节点放入到此节点内,执行 completeUnitOfWork 时,它的子节点都执行了 completeUnitOfWork

    5. 将创建的 dom 放入 workInProgress.stateNode

    6. 此节点还有 sibling,则 workInProgress = siblingFiber

    相关文章

      网友评论

          本文标题:React 18 源代码学习 11 completeUnitOf

          本文链接:https://www.haomeiwen.com/subject/tnotortx.html