美文网首页
React 源码探源 3 Update 的整体流程

React 源码探源 3 Update 的整体流程

作者: 吴摩西 | 来源:发表于2021-06-22 20:57 被阅读0次

    综述

    书接上一章节: React 源码探源 2 Mount 复杂的例子.
    参考上文提到的 fibre tree,如下

    render 的结果
    跟踪 update 调用栈,发现如下:
    Update 调用栈
    debug 到源码中,可以绘制主要的调用流程如下:
    Update 主要流程
    主要的流程可以分为三个阶段,事件响应,Render, Commit。

    事件响应

    值得注意的是,虽然事件是从 button 中触发,最终也是触发了 buttononClick 回调函数。整体的事件处理却不是从 button 的 DOM 节点触发。却是

    1. 通过事件的冒泡机制上抛到 div#container,再从 div#container 整体处理
    2. extractEvent$5 根据 event.target 找到事件的冒泡路径上的所有响应函数。响应函数是从 DOM 节点对应的 _reactProps属性中读出的。
    3. 本例中, onClick 含有 setState 的调用,setState 中会将 fiber Dev()lanes 设置为 1。
    4. 事件的回调会通过 scheduleLegacySyncCallbackperformSyncWorkOnRoot push 到 syncQueue 中,并会更新根结点 lanes ,阻止再次将回调推进 syncQueue
    5. 最终会通过 flushSyncCallbacks 调用 syncQueue 中的回调。

    Render 阶段

    1. 如果 fiber 的 props 有所变动,会有标记 didReceiveUpdate = true
    2. 如果 fiber 的 lances 有所变动或者有 context,才会执行函数组件或者类组件的 render 函数。如果有 state 变动,也会标记 didReceiveUpdate = true
    3. 如果 fiber 的 lances 没有变动,也没有 props 变动,会执行 bailoutOnAlreadyFinishedWork 跳过对应的
      beginWork 阶段。不会执行组件对应的 render 函数。
    4. 当执行对应的 HostText completeWork 阶段时,会检查对应的 props 变动,标记对应的 flag为 4(Update),当有类似的变动时,会标记其所有的父节点的 subtreeFlag 也有 4(Update)

    Commit 阶段

    commitMutationEffects 会检查 fiber 的 flagsubtreeFlag 执行对应的更新操作。本阶段的更新过程会在后续的序列中继续探究。

    相关文章

      网友评论

          本文标题:React 源码探源 3 Update 的整体流程

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