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

資訊專欄INFORMATION COLUMN

從代碼實踐潛入React內部,深入diff

leap_frog / 3440人閱讀

摘要:概述協調,調解本身不存在公共的。安裝的確切結果有時在源代碼中稱為取決于渲染器,可以是節點,字符串或表示原生視圖。關鍵的缺失部分是對更新的支持。為避免混淆,我們將和的實例叫做內部實例。但是,內部實例樹包含復合和主機內部實例。

本節是 stack reconciler程序的實現說明的集合。

本文有一定的技術含量,要對React公共API以及它如何分為核心,渲染器和協調(和解,reconciler)程序有很深的理解。如果你對React代碼庫不是很熟悉,請首先閱讀代碼庫概述。

它還假設你了解React組件的實例和元素之間的差異。

stack reconciler用于15版本和早期. 它的代碼在 src/renderers/shared/stack/reconciler.

視頻:從頭開始構建React

Paul O’Shannessy談到了從頭開始構建react,這在很大程度上啟發了這個文檔。

本文檔和他的演講都是對實際代碼庫的簡化,因此你可以通過熟悉它們來獲得更好的理解。

概述

reconciler(協調,調解)本身不存在公共的API。像React DOM和React Native這樣的渲染器使用它根據用戶編寫的React組件有效地更新用戶界面。

掛載(mounting)作為遞歸過程

讓我們考慮第一次掛載組件:

ReactDOM.render(, rootEl);

React DOM會將傳遞給調節器(reconciler)。請記住,是一個React元素,即對要呈現的內容的描述。你可以將其視為普通對象(筆者:不了解的可以查看這篇文章):

console.log();
// { type: App, props: {} }

調解器會檢查這個App是類還是函數(對于這個得實現可以查看如何知道是函數還是類這篇文章)。

如果App是一個函數,則調解器將調用App(props)來獲取渲染元素。

如果App是一個類,那么調解器會通過new App(props)去實例化App,調用componentWillMount生命周期方法,然后調用render方法來獲取渲染的元素。

無論哪種方式,調解器都將得知App“渲染到”的元素。

這個過程是遞歸的。App可能會渲染,可能會渲染

),都沒有關系,都會去讓渲染器去負責mounting它。

由子組件生成的DOM節點將附加到父DOM節點,并且將遞歸地組裝完整的DOM結構。

注意: 調解器本身與DOM無關。mounting(安裝)的確切結果(有時在源代碼中稱為“mount image”)取決于渲染器,可以是DOM節點(React DOM),字符串(React DOM Server)或表示原生視圖(React Native)。

如果我們要擴展代碼來處理計算機元素,它將如下所示:

function isClass(type) {
  // 繼承自 React.Component 類有一個標簽 isReactComponent
  return (
    Boolean(type.prototype) &&
    Boolean(type.prototype.isReactComponent)
  );
}

// 這個函數只處理復合的元素
// 比如像是, 

這是有效的,但仍遠未達到協調者的實際運行方式。關鍵的缺失部分是對更新的支持。

介紹內部實例

react的關鍵特點是你可以重新渲染所有東西,它不會重新創建DOM或重置狀態。

ReactDOM.render(, rootEl);
// 應該重用現有的DOM:
ReactDOM.render(, rootEl);

但是,我們上面的實現只知道如何掛載初始樹。它無法對其執行更新,因為它不存儲所有必需的信息,例如所有publicInstances,或哪些DOM節點對應于哪些組件。

堆棧協調器代碼庫通過使mount函數成為一個類上面的方法來解決這個問題。但是這種方法存在一些缺點,我們在正在進行的協調重寫任務中正朝著相反的方向去發展(筆者:目前fiber已經出來了)。不過 這就是它現在的運作方式。

我們將創建兩個類:DOMComponentCompositeComponent,而不是多帶帶的mountHostmountComposite函數。

兩個類都有一個接受元素的構造函數,以及一個返回已安裝節點的mount()方法。我們將用實例化類的工廠替換頂級mount()函數:

function instantiateComponent(element) {
  var type = element.type;
  if (typeof type === "function") {
    // 用戶定義的組件
    return new CompositeComponent(element);
  } else if (typeof type === "string") {
    // 特定于平臺的組件,如計算機組件(
) return new DOMComponent(element); } }

首先,讓我們考慮下CompositeComponent的實現:

class CompositeComponent {
  constructor(element) {
    this.currentElement = element;
    this.renderedComponent = null;
    this.publicInstance = null;
  }

  getPublicInstance() {
    // 對于復合的組件,暴露類的實例
    return this.publicInstance;
  }

  mount() {
    var element = this.currentElement;
    var type = element.type;
    var props = element.props;

    var publicInstance;
    var renderedElement;
    if (isClass(type)) {
      // Component class
      publicInstance = new type(props);
      // Set the props
      publicInstance.props = props;
      // Call the lifecycle if necessary
      if (publicInstance.componentWillMount) {
        publicInstance.componentWillMount();
      }
      renderedElement = publicInstance.render();
    } else if (typeof type === "function") {
      // Component function
      publicInstance = null;
      renderedElement = type(props);
    }

    // Save the public instance
    this.publicInstance = publicInstance;

    // 根據元素實例化子內部實例
    // 他將是DOMComponent,例如
,

// 或者是CompositeComponent,例如,

這與我們之前的mountComposite()實現沒什么不同,但現在我們可以存儲一些信息,例如this.currentElement,this.renderedComponentthis.publicInstance,在更新期間使用。

請注意,CompositeComponent的實例與用戶提供的element.type的實例不同。CompositeComponent是我們的協調程序的實現細節,永遠不會向用戶公開。用戶定義的類是我們從element.type讀取的,CompositeComponent會創建這個類的實例。

為避免混淆,我們將CompositeComponentDOMComponent的實例叫做“內部實例”。 它們存在,因此我們可以將一些長期存在的數據與它們相關聯。只有渲染器和調解器知道它們存在。

相反,我們將用戶定義類的實例稱為“公共實例(public instance)”。 公共實例是你在render()和組件其他的方法中看到的this.

至于mountHost()方法,重構成了在DOMComponent類上的mount()方法,看起來像這樣:

class DOMComponent {
  constructor(element) {
    this.currentElement = element;
    this.renderedChildren = [];
    this.node = null;
  }

  getPublicInstance() {
    // For DOM components, only expose the DOM node.
    return this.node;
  }

  mount() {
    var element = this.currentElement;
    var type = element.type;
    var props = element.props;
    var children = props.children || [];
    if (!Array.isArray(children)) {
      children = [children];
    }

    // Create and save the node
    var node = document.createElement(type);
    this.node = node;

    // Set the attributes
    Object.keys(props).forEach(propName => {
      if (propName !== "children") {
        node.setAttribute(propName, props[propName]);
      }
    });

    // 創建并保存包含的子元素
    // 這些子元素,每個都可以是DOMComponent或CompositeComponent
    // 這些匹配是依賴于元素類型的返回值(string或function)
    var renderedChildren = children.map(instantiateComponent);
    this.renderedChildren = renderedChildren;

    // Collect DOM nodes they return on mount
    var childNodes = renderedChildren.map(child => child.mount());
    childNodes.forEach(childNode => node.appendChild(childNode));

    // DOM節點作為mount的節點返回
    return node;
  }
}

與上面的相比,mountHost()重構之后的主要區別是現在將this.nodethis.renderedChildren與內部DOM組件實例相關聯。我們會用他來用于在后面做非破壞性的更新。

因此,每個內部實例(復合或主機)現在都指向其子級內部實例。為了幫助可視化,如果函數組件呈現

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

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

相關文章

  • react進階漫談

    摘要:父組件向子組件之間非常常見,通過機制傳遞即可。我們應該聽說過高階函數,這種函數接受函數作為輸入,或者是輸出一個函數,比如以及等函數。在傳遞數據的時候,我們可以用進一步提高性能。 本文主要談自己在react學習的過程中總結出來的一些經驗和資源,內容邏輯參考了深入react技術棧一書以及網上的諸多資源,但也并非完全照抄,代碼基本都是自己實踐,主要為平時個人學習做一個總結和參考。 本文的關鍵...

    neuSnail 評論0 收藏0
  • react進階漫談

    摘要:父組件向子組件之間非常常見,通過機制傳遞即可。我們應該聽說過高階函數,這種函數接受函數作為輸入,或者是輸出一個函數,比如以及等函數。在傳遞數據的時候,我們可以用進一步提高性能。 本文主要談自己在react學習的過程中總結出來的一些經驗和資源,內容邏輯參考了深入react技術棧一書以及網上的諸多資源,但也并非完全照抄,代碼基本都是自己實踐,主要為平時個人學習做一個總結和參考。 本文的關鍵...

    wyk1184 評論0 收藏0
  • react進階漫談

    摘要:父組件向子組件之間非常常見,通過機制傳遞即可。我們應該聽說過高階函數,這種函數接受函數作為輸入,或者是輸出一個函數,比如以及等函數。在傳遞數據的時候,我們可以用進一步提高性能。 本文主要談自己在react學習的過程中總結出來的一些經驗和資源,內容邏輯參考了深入react技術棧一書以及網上的諸多資源,但也并非完全照抄,代碼基本都是自己實踐,主要為平時個人學習做一個總結和參考。 本文的關鍵...

    junnplus 評論0 收藏0
  • FE.SRC-React實戰與原理筆記

    摘要:異步實戰狀態管理與組件通信組件通信其他狀態管理當需要改變應用的狀態或有需要更新時,你需要觸發一個把和載荷封裝成一個。的行為是同步的。所有的狀態變化必須通過通道。前端路由實現與源碼分析設計思想應用是一個狀態機,視圖與狀態是一一對應的。 React實戰與原理筆記 概念與工具集 jsx語法糖;cli;state管理;jest單元測試; webpack-bundle-analyzer Sto...

    PumpkinDylan 評論0 收藏0
  • 2017文章總結

    摘要:歡迎來我的個人站點性能優化其他優化瀏覽器關鍵渲染路徑開啟性能優化之旅高性能滾動及頁面渲染優化理論寫法對壓縮率的影響唯快不破應用的個優化步驟進階鵝廠大神用直出實現網頁瞬開緩存網頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優化動 歡迎來我的個人站點 性能優化 其他 優化瀏覽器關鍵渲染路徑 - 開啟性能優化之旅 高性能滾動 scroll 及頁面渲染優化 理論 | HTML寫法...

    dailybird 評論0 收藏0

發表評論

0條評論

leap_frog

|高級講師

TA的文章

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