v19.2Latest

將你的 UI 理解為樹狀結構

你的 React 應用程式正隨著許多元件相互嵌套而逐漸成形。React 是如何追蹤你的應用程式元件結構的呢?

React 以及許多其他 UI 函式庫,都將 UI 建模為樹狀結構。將你的應用程式視為一棵樹,有助於理解元件之間的關係。這種理解將幫助你除錯未來的概念,例如效能和狀態管理。

您將學習
  • React 如何「看待」元件結構
  • 什麼是渲染樹及其用途
  • 什麼是模組依賴樹及其用途

你的 UI 作為樹狀結構

樹狀結構是項目之間的關係模型。UI 通常使用樹狀結構來表示。例如,瀏覽器使用樹狀結構來建模 HTML(DOM)和 CSS(CSSOM)。行動平台也使用樹狀結構來表示其視圖層次結構。

一個由三個水平排列部分組成的圖表。在第一部分中,有三個垂直堆疊的矩形,標籤分別為「元件 A」、「元件 B」和「元件 C」。過渡到下一個窗格的箭頭上帶有 React 標誌,標記為「React」。中間部分包含一個元件樹,根節點標記為「A」,兩個子節點標記為「B」和「C」。下一部分再次使用帶有 React 標誌的箭頭過渡,標記為「React DOM」。第三個也是最後一個部分是瀏覽器的線框圖,包含一個 8 個節點的樹,其中僅高亮顯示了一個子集(表示來自中間部分的子樹)。一個由三個水平排列部分組成的圖表。在第一部分中,有三個垂直堆疊的矩形,標籤分別為「元件 A」、「元件 B」和「元件 C」。過渡到下一個窗格的箭頭上帶有 React 標誌,標記為「React」。中間部分包含一個元件樹,根節點標記為「A」,兩個子節點標記為「B」和「C」。下一部分再次使用帶有 React 標誌的箭頭過渡,標記為「React DOM」。第三個也是最後一個部分是瀏覽器的線框圖,包含一個 8 個節點的樹,其中僅高亮顯示了一個子集(表示來自中間部分的子樹)。

React 從你的元件建立一個 UI 樹。在此範例中,UI 樹隨後被用於渲染到 DOM。

與瀏覽器和行動平台類似,React 也使用樹狀結構來管理和建模 React 應用程式中元件之間的關係。這些樹狀結構是理解資料如何在 React 應用程式中流動,以及如何最佳化渲染和應用程式大小的有用工具。

渲染樹

元件的一個主要特性是能夠組合其他元件。當我們嵌套元件時,我們就有了父元件和子元件的概念,其中每個父元件本身也可能是另一個元件的子元件。

當我們渲染一個 React 應用程式時,我們可以在一個樹狀結構中建模這種關係,稱為渲染樹。

這是一個渲染勵志名言的 React 應用程式。

包含五個節點的樹狀圖。每個節點代表一個元件。樹的根節點是 App,從它延伸出兩個箭頭指向「InspirationGenerator」和「FancyText」。箭頭標記為「renders」。「InspirationGenerator」節點也有兩個箭頭指向節點「FancyText」和「Copyright」。包含五個節點的樹狀圖。每個節點代表一個元件。樹的根節點是 App,從它延伸出兩個箭頭指向「InspirationGenerator」和「FancyText」。箭頭標記為「renders」。「InspirationGenerator」節點也有兩個箭頭指向節點「FancyText」和「Copyright」。

React 建立一個渲染樹,一個由已渲染元件組成的 UI 樹。

從範例應用程式中,我們可以建構出上述的渲染樹。

該樹由節點組成,每個節點代表一個元件。AppFancyTextCopyright,僅舉幾例,都是我們樹中的節點。

React 渲染樹中的根節點是應用程式的根元件。在此案例中,根元件是App,它是 React 渲染的第一個元件。樹中的每個箭頭都從父元件指向子元件。

Deep Dive
渲染樹中的 HTML 標籤在哪裡?

渲染樹代表了 React 應用程式的一次渲染過程。透過條件式渲染,父元件可能會根據傳遞的資料渲染不同的子元件。

我們可以更新應用程式,使其有條件地渲染勵志名言或顏色。

樹狀圖,包含六個節點。樹的頂部節點標記為 'App',有兩個箭頭分別指向標記為 'InspirationGenerator' 和 'FancyText' 的節點。箭頭是實線,並標有 'renders' 字樣。'InspirationGenerator' 節點也有三個箭頭。指向 'FancyText' 和 'Color' 節點的箭頭是虛線,並標有 'renders?'。最後一個箭頭指向標記為 'Copyright' 的節點,是實線並標有 'renders'。樹狀圖,包含六個節點。樹的頂部節點標記為 'App',有兩個箭頭分別指向標記為 'InspirationGenerator' 和 'FancyText' 的節點。箭頭是實線,並標有 'renders' 字樣。'InspirationGenerator' 節點也有三個箭頭。指向 'FancyText' 和 'Color' 節點的箭頭是虛線,並標有 'renders?'。最後一個箭頭指向標記為 'Copyright' 的節點,是實線並標有 'renders'。

透過條件式渲染,在不同的渲染過程中,渲染樹可能會渲染不同的元件。

在這個範例中,根據 inspiration.type是什麼,我們可能會渲染<FancyText><Color>。每次渲染過程的渲染樹可能都不同。

儘管渲染樹在每次渲染過程中可能不同,但這些樹通常有助於識別 React 應用程式中哪些是頂層元件以及哪些是葉子元件。頂層元件是最接近根元件的元件,它們影響其下所有元件的渲染效能,並且通常包含最複雜的邏輯。葉子元件位於樹的底部,沒有子元件,並且經常被重新渲染。

識別這些類別的元件對於理解應用程式的資料流和效能非常有用。

模組依賴樹

React 應用程式中另一種可以用樹來建模的關係是應用程式的模組依賴關係。當我們將元件和邏輯拆分到不同的檔案時,我們會建立 JS 模組,在其中我們可以匯出元件、函數或常數。

模組依賴樹中的每個節點都是一個模組,每個分支代表該模組中的一個import 語句。

如果我們拿之前的 Inspirations 應用程式為例,我們可以建構一個模組依賴樹,或簡稱依賴樹。

一個包含七個節點的樹狀圖。每個節點都標有模組名稱。樹的頂層節點標為 'App.js'。有三個箭頭指向模組 'InspirationGenerator.js'、'FancyText.js' 和 'Copyright.js',箭頭標示為 'imports'。從 'InspirationGenerator.js' 節點,有三個箭頭延伸至三個模組:'FancyText.js'、'Color.js' 和 'inspirations.js'。箭頭標示為 'imports'。一個包含七個節點的樹狀圖。每個節點都標有模組名稱。樹的頂層節點標為 'App.js'。有三個箭頭指向模組 'InspirationGenerator.js'、'FancyText.js' 和 'Copyright.js',箭頭標示為 'imports'。從 'InspirationGenerator.js' 節點,有三個箭頭延伸至三個模組:'FancyText.js'、'Color.js' 和 'inspirations.js'。箭頭標示為 'imports'。

Inspirations 應用程式的模組依賴樹。

樹的根節點是根模組,也稱為入口點檔案。它通常是包含根元件的模組。

與同一個應用程式的渲染樹相比,結構相似但有一些顯著差異:

  • 構成樹的節點代表模組,而非元件。
  • 非元件模組,例如 inspirations.js,也會在此樹中表示。渲染樹僅封裝元件。
  • Copyright.js 出現在 App.js之下,但在渲染樹中,Copyright 元件則作為 InspirationGenerator的子元件出現。這是因為InspirationGenerator接受 JSX 作為子元件屬性,因此它將Copyright渲染為子元件,但並未匯入該模組。

依賴樹對於確定運行 React 應用程式需要哪些模組非常有用。在為生產環境建構 React 應用程式時,通常會有一個建構步驟,將所有必要的 JavaScript 打包以發送給客戶端。負責此工作的工具稱為打包工具,打包工具會使用依賴樹來確定應包含哪些模組。

隨著應用程式的增長,打包檔案的大小通常也會增加。過大的打包檔案對客戶端來說下載和運行成本高昂。過大的打包檔案可能會延遲使用者介面的繪製時間。了解應用程式的依賴樹可能有助於調試這些問題。

回顧

  • 樹是一種表示實體之間關係的常見方式。它們通常用於為使用者介面建模。
  • 渲染樹表示單次渲染中 React 元件之間的嵌套關係。
  • 透過條件渲染,渲染樹可能會在不同的渲染中發生變化。使用不同的屬性值,元件可能會渲染不同的子元件。
  • 渲染樹有助於識別哪些是頂層元件和葉子元件。頂層元件會影響其下所有元件的渲染效能,而葉子元件通常會頻繁重新渲染。識別它們對於理解和調試渲染效能非常有用。
  • 依賴樹表示 React 應用程式中的模組依賴關係。
  • 建構工具使用依賴樹來打包發送應用程式所需的程式碼。
  • 依賴樹對於調試導致繪製時間變慢的大型打包檔案非常有用,並能揭示優化打包程式碼的機會。