首頁  >  文章  >  web前端  >  ReactDom.render的詳細解析

ReactDom.render的詳細解析

不言
不言轉載
2019-04-04 11:09:533933瀏覽

這篇文章帶給大家的內容是關於ReactDom.render的詳細解析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

步驟

1.建立ReactRoot

#2.建立FiberRoot和FiberRoot

3.建立更新

#render方法:

render(
    element: React$Element<any>,
    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<any, any>,
  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,這些進行調度演算法和進行優先權判斷

【相關推薦:react影片教學

以上是ReactDom.render的詳細解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除