国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ReactDom.render分析

cjie / 3312人閱讀

摘要:先檢驗是否存在不存在則執行傳入,后的函數創建一個。方法更新執行方法,這個方法最終調用和并返回,這些進行調度算法和進行優先級判斷

1.步驟 1.創建ReactRoot 2.創建FiberRoot和FiberRoot 3.創建更新 2. render方法:
render(
    element: React$Element,
    container: DOMContainer,
    callback: ?Function,
  ) {
    invariant(
      isValidContainer(container),
      "Target container is not a DOM element.",
    );
    return legacyRenderSubtreeIntoContainer(
      null,
      element,
      container,
      false,
      callback,
    );
  },

render方法可以傳入三個參數包括ReactElement、DOM的包裹節點,和渲染結束后執行的回調方法。
然后驗證invariant驗證container是否是有效的Dom節點。
最后返回legacyRenderSubtreeIntoContainer方法執行后的結果,再來看看這個方法的參數

function legacyRenderSubtreeIntoContainer(
  parentComponent: ?React$Component,
  children: ReactNodeList,
  container: DOMContainer,
  forceHydrate: boolean,
  callback: ?Function,
) 
這里傳入五個參數,第一個是parentComponent不存在傳入null,第二個是傳入container的子元素,第三個是創建ReactRoot的包裹元素,第四個是協調更新的選項,第五個是渲染后的回調方法。
let root: Root = (container._reactRootContainer: any);
  if (!root) {
    // Initial mount
    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(
      container,
      forceHydrate,
    );
先檢驗ReactRoot是否存在不存在則執行傳入container,
forceHydrate后的legacyCreateRootFromDOMContainer函數創建一個ReactRoot。forceHydrate在render方法中傳入的false,在Hydrate方法中傳入的true,主要是為了區分服務端渲染和客戶端渲染,true時未復用原來的節點適合服務端渲染,
如果是false則執行container.removeChild(rootSibling)刪除所有的子節點。
然后返回通過 new ReactRoot(container, isConcurrent, shouldHydrate)
function ReactRoot(
  container: DOMContainer,
  isConcurrent: boolean,
  hydrate: boolean,
) {
  const root = createContainer(container, isConcurrent, hydrate);
  this._internalRoot = root;
}

在這個方法中調用createContainer創建root,這個方法從react-reconciler/inline.dom文件中引入:

export function createContainer(
  containerInfo: Container,
  isConcurrent: boolean,
  hydrate: boolean,
): OpaqueRoot {
  return createFiberRoot(containerInfo, isConcurrent, hydrate);
}

在這個方法中又調用了createFiberRoot方法創建FiberRoot
在創建玩root后執行unbatchedUpdates更新,傳入root。render方法更新:

unbatchedUpdates(() => {
      if (parentComponent != null) {
        root.legacy_renderSubtreeIntoContainer(
          parentComponent,
          children,
          callback,
        );
      } else {
        root.render(children, callback);
      }
    });

執行updateContainer(children, root, null, work._onCommit);方法,這個方法最終調用enqueueUpdatescheduleWork,并返回expireTime,這些進行調度算法和進行優先級判斷

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103185.html

相關文章

  • ReactDOM.render源碼解析-1

    摘要:本文將對源碼做一個初步解析。首先在方法中校驗參數是否合法,然后調用在中,調用拿到了的一個實例,調用拿到了,用于注入到,和作為返回值,調用開始調度過程在中,首先清理了中的所有子節點,然后了一個并返回是如何調度的是一個什么樣的類的操作是在哪里 初步看了react-dom這個包的一些源碼,發現其比react包要復雜得多,react包中基本不存在跨包調用的情況,他所做的也僅僅是定義了React...

    _Zhao 評論0 收藏0
  • ReactRoot與ReactWork源碼分析

    摘要:在中調用獲得了的實例,然后調用其中的回調函數中調用了方法。這個類主要介紹其構造函數和方法,構造函數是時調用的,方法是的回調函數中使用的。這個將在下一篇分析。另外,方法是在的回調函數中調用的,也是一個參與后面調度的關鍵。 在ReactDOM.render源碼解析-1中介紹了第一次render的基本過程的一部分,其中產生了ReactRoot和ReactWork兩個類的實例。本文介紹下Rea...

    macg0406 評論0 收藏0
  • react解析: render的FiberRoot(三)

    摘要:查看創建核心函數源碼行調用函數創建是相關,不用管源碼行這個指的是調用創建,下面我們將會說到對象源碼行源碼行函數中,首先創建了一個,然后又創建了一個,它們兩者還是相互引用。 感謝 yck: 剖析 React 源碼解析,本篇文章是在讀完他的文章的基礎上,將他的文章進行拆解和加工,加入我自己的一下理解和例子,便于大家理解。覺得yck寫的真的很棒 。React 版本為 16.8.6,關于源碼的...

    muddyway 評論0 收藏0
  • ReactDOM You Should

    摘要:并不是組件中的任何地方都能夠使用獲取結構,只對掛載后的組件生效。組件的一個特殊屬性,接受一個回調函數作為參數。反之,則表示卸載失敗。再看一下這段代碼這個回調函數其實是沒有參數的,但是,當方法變成異步方法之后,說不定就會向其注入一些參數了。 在react的組件的開發過程中,一般來說,我們并不會真正的去操作dom。只有在頂層組件的渲染的過程中,我們借助ReactDOM.render()方法...

    mo0n1andin 評論0 收藏0
  • React系列 --- 簡單模擬語法(一)

    摘要:系列系列簡單模擬語法一系列合成事件與二系列算法實現分析三系列從到再到四系列與部分源碼解析五系列從使用了解的各種使用方案六前言我們先不講什么語法原理先根據效果強行模擬語法使用實現一個簡易版的第一步我們先用類 React系列 React系列 --- 簡單模擬語法(一)React系列 --- Jsx, 合成事件與Refs(二)React系列 --- virtualdom diff算法實現分析...

    piglei 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<