国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - React - React Fiber結構的創建步驟

React Fiber結構的創建步驟

2022-03-02 16:36光光同學22167 React

這篇文章主要介紹了React Fiber結構的創建步驟,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

React Fiber的創建

當前React版本基于V17.0.2版本,本篇主要介紹fiber結構的創建。

一、開始之前

個人理解,如有不對,請指出。

首先需要配置好React的debugger開發環境,入口在這里:github

執行npm run i,安裝依賴,npm start運行環境。

二、從React.render開始

通過在項目入口處調用React.render,打上Debug,查看React調用棧。

const root = document.getElementById("root");
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  root
);

在React調用render之后,在傳入基礎的配置后,調用legacyRenderSubtreeIntoContainer。

export function render(
  element: React$Element<any>,
  container: Container,
  callback: ?Function,
) {
  // 刪除一些環境代碼
  // ...
  return legacyRenderSubtreeIntoContainer(
    null,
    element,
    container,
    false,
    callback,
  );
}

在React調用render之后,在傳入基礎的配置后,調用legacyRenderSubtreeIntoContainer。

export function render(
  element: React$Element<any>,
  container: Container,
  callback: ?Function,
) {
  // 刪除一些環境代碼
  // ...
  return legacyRenderSubtreeIntoContainer(
    null,
    element,
    container,
    false,
    callback,
  );
}

legacyRenderSubtreeIntoContainer一共做了兩件事情,一個是生成了fiberRoot,一個是調用updateContainer。

React Fiber結構的創建步驟

進入legacyCreateRootFromDOMContainer函數,查看如何生成fiberRoot。 在函數內部,調用了createLegacyRoot,在這里區分了下,是否使用hydrate,如下:

  return createLegacyRoot(
    container,
    shouldHydrate
      ? {
        hydrate: true,
      }
      : undefined,
  );

對于createLegacyRoot來說,是用來實例化ReactDOMLegacyRoot函數的,通過后續調用,終于進入到root的生成,調用createRootImpl函數,實例化root。

進入createFiberRoot函數,初始化FiberRootNode。

function FiberRootNode(containerInfo, tag, hydrate) {
  this.tag = tag; // 類型
  this.containerInfo = containerInfo; // container
  this.pendingChildren = null; 
  this.current = null;
  this.pingCache = null;
  this.finishedWork = null;
  this.timeoutHandle = noTimeout;
  this.context = null;
  this.pendingContext = null;
  this.hydrate = hydrate;
  this.callbackNode = null;
  this.callbackPriority = NoLanePriority;
  this.eventTimes = createLaneMap(NoLanes);
  this.expirationTimes = createLaneMap(NoTimestamp);

  this.pendingLanes = NoLanes;
  this.suspendedLanes = NoLanes;
  this.pingedLanes = NoLanes;
  this.mutableReadLanes = NoLanes;
  this.finishedLanes = NoLanes;

  this.entangledLanes = NoLanes;
  this.entanglements = createLaneMap(NoLanes);

  // ....


}

這里的tag,有以下幾種類型。

export type RootTag = 0 | 1;

上述的結構是fiberRootNode節點。

rootTag 等于0 時,代表legacy渲染模式,等于1時,代表Concurrent mode渲染,也就是說,傳統我們使用React.render進行渲染,當調用React.createRoot時,進入Concurrent mode渲染模式,即并行渲染。

現在我們一起看看fiber的結構。

  const uninitializedFiber = createHostRootFiber(tag, strictModeLevelOverride);
  root.current = uninitializedFiber;
  uninitializedFiber.stateNode = root;

uninitializedFiber為創建的FiberNode的創建的實例。

const createFiber = function(
  tag: WorkTag,
  pendingProps: mixed,
  key: null | string,
  mode: TypeOfMode,
): Fiber {
  // $FlowFixMe: the shapes are exact here but Flow doesn"t like constructors
  return new FiberNode(tag, pendingProps, key, mode);
};

通過基礎的創建,生成FiberNode結構,如下

function FiberNode(
  tag: WorkTag,
  pendingProps: mixed,
  key: null | string,
  mode: TypeOfMode,
) {
  // Instance
  this.tag = tag;//組件類型
  this.key = key;//key屬性
  this.elementType = null;//元素類型,類函數,顯示類,div顯示div
  this.type = null;//func或者class
  this.stateNode = null;//dom節點

  // Fiber
  this.return = null;//指向父節點
  this.child = null;//指向子節點
  this.sibling = null;//兄弟節點
  this.index = 0;//

  this.ref = null;

  this.pendingProps = pendingProps;//等待中的屬性pendingProps
  this.memoizedProps = null; //記憶屬性,一般存放props
  this.updateQueue = null;//更新隊列
  this.memoizedState = null;// 一般存放state
  this.dependencies = null;

  this.mode = mode;

  // Effects相關
  this.flags = NoFlags;
  this.subtreeFlags = NoFlags;
  this.deletions = null;

  this.lanes = NoLanes;
  this.childLanes = NoLanes;

  this.alternate = null;//指向workInProgress
}

React Fiber結構的創建步驟

 FiberNode基本顯示如上,elementType和type的基礎類型為function、class。

通過對比fiberRootNode結構,和下面的代碼,生成最終的FiberNode 結構。

render() {
    const { name, count } = this.state;
    return (
      <div className="App">
          <Button name={name} />
        {
          count
        }
      </div>
    );
  }
ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  root
);

通過最后執行,生成fiberRoot鏈表結構。

React Fiber結構的創建步驟

最后,調用unbatchedUpdates,進行渲染。

進入updateContainer函數。

unbatchedUpdates(() => {
  // 更新container
  updateContainer(children, fiberRoot, parentComponent, callback);
});

三、結束

以上就是React Fiber結構的創建步驟的詳細內容,更多關于React Fiber結構的創建的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6950692243485229086

延伸 · 閱讀

精彩推薦
  • ReactReact.Children的用法詳解

    React.Children的用法詳解

    這篇文章主要介紹了React.Children的用法詳解,幫助大家更好的理解和學習使用React框架,感興趣的朋友可以了解下...

    uuihoo10692022-02-23
  • React必須要會的50個React面試題

    必須要會的50個React面試題

    如果你是一位有抱負的前端程序員并準備面試,那么這篇文章很適合你。本文是你學習和面試 React 所需知識的完美指南。...

    瘋狂的技術宅9082022-02-23
  • ReactReact中useRef的具體使用

    React中useRef的具體使用

    這篇文章主要介紹了React中useRef的具體使用,它可以用來獲取組件實例對象或者是DOM對象,除此之外還有哪些用法,就一起來了解一下...

    Meskjei6332022-02-28
  • ReactReact html中使用react的兩種方式

    React html中使用react的兩種方式

    這篇文章主要介紹了React html中使用react的兩種方式,本文給大家提到了React pwa的配置代碼,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒...

    愚公搬代碼6332022-02-23
  • React基于Vite 的組件文檔編寫神器,又快又省心

    基于Vite 的組件文檔編寫神器,又快又省心

    翻閱 Vite 的官方庫列表,偶然發現了一款 star 數量僅 100 多的文檔解決方案 vite-plugin-react-pages。開始用試試水的心態去去體驗一把,結果發現相當好用。...

    前端星辰9382021-12-27
  • ReactReact利用路由實現登錄界面的跳轉

    React利用路由實現登錄界面的跳轉

    這篇文章主要介紹了React利用路由實現登錄界面的跳轉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    前端子金6422022-02-23
  • React一百多行代碼實現react拖拽hooks

    一百多行代碼實現react拖拽hooks

    這篇文章主要介紹了一百多行代碼實現react拖拽hooks,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    孟祥_成都5952022-02-20
  • ReactWebpack3+React16代碼分割的實現

    Webpack3+React16代碼分割的實現

    這篇文章主要介紹了Webpack3+React16代碼分割的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面...

    小葉子8832022-01-25
主站蜘蛛池模板: av在线免费网址 | 成人精品视频在线观看 | 精品视频在线播放 | 中文字幕日韩欧美一区二区三区 | 欧美成人高清视频 | 国产一极片 | 男人的天堂在线免费视频 | 中文二区| 欧美1区 | 91仓库| 免费高清av| 亚洲综合中文字幕在线 | 黄色av一级片 | 中文字幕在线观看日韩 | 视频一区 中文字幕 | 亚洲欧美激情精品一区二区 | 色av网 | 午夜免费视频网站 | 国产精品日韩欧美一区二区三区 | 精品久久久久久 | 国产精品美女www爽爽爽软件 | 国产视频1区 | 97人人爱| 欧美一区二区三区视频在线观看 | 亚洲精品影院 | 欧美日韩精品一区二区三区 | 国产精品国产a级 | 在线观看中文字幕亚洲 | 久久99国产精品 | 久久午夜精品 | 久久久综合视频 | 99热视| 久久99深爱久久99精品 | 日韩欧美在线综合网 | 男女啪啪免费网站 | 操操操av| 久久久成人精品 | 久久亚洲黄色 | 亚洲精品一区 | 国产精品高清在线观看 | 欧美亚洲国产日韩 |