Spec-Zone.ru › React 18

Понимание вашего пользовательского интерфейса как дерева

Ваше приложение React формируется с множеством компонентов, вложенных друг в друга. Как React отслеживает структуру компонентов вашего приложения?

React, и многие другие библиотеки пользовательского интерфейса, представляют пользовательский интерфейс в виде дерева. Представление вашего приложения как дерева полезно для понимания взаимоотношений между компонентами. Это понимание поможет вам отладить будущие концепции, такие как производительность и управление состоянием.

Вы узнаете

  • Как React «видит» структуру компонентов
  • Что такое дерево отрисовки и для чего оно полезно
  • Что такое дерево зависимостей модулей и для чего оно полезно

Ваше пользовательский интерфейс как дерево

Деревья — это модель отношений между элементами, и пользовательский интерфейс часто представляется в виде древовидных структур. Например, браузеры используют древовидные структуры для моделирования HTML (DOM) и CSS (CSSOM). Мобильные платформы также используют деревья для представления своей иерархии представлений.

Diagram with three sections arranged horizontally. In the first section, there are three rectangles stacked vertically, with labels 'Component A', 'Component B', and 'Component C'. Transitioning to the next pane is an arrow with the React logo on top labeled 'React'. The middle section contains a tree of components, with the root labeled 'A' and two children labeled 'B' and 'C'. The next section is again transitioned using an arrow with the React logo on top labeled 'React DOM'. The third and final section is a wireframe of a browser, containing a tree of 8 nodes, which has only a subset highlighted (indicating the subtree from the middle section).

React создает дерево пользовательского интерфейса из ваших компонентов. В этом примере дерево пользовательского интерфейса затем используется для отрисовки в DOM.

Как браузеры и мобильные платформы, React также использует древовидные структуры для управления и моделирования отношений между компонентами в приложении React. Эти деревья являются полезными инструментами для понимания того, как данные передаются через приложение React, и как оптимизировать отрисовку и размер приложения.

Дерево отрисовки

Главная особенность компонентов — возможность композиции компонентов из других компонентов. Когда мы вкладываем компоненты, у нас есть концепция родительских и дочерних компонентов, где каждый родительский компонент сам может быть потомком другого компонента.

При отрисовке приложения React мы можем смоделировать эти отношения в дереве, известном как дерево отрисовки.

Вот приложение React, которое отображает вдохновляющие цитаты.

import FancyText from './FancyText';
import InspirationGenerator from './InspirationGenerator';
import Copyright from './Copyright';

export default function App() {
  return (
    <>
      <FancyText title text="Get Inspired App" />
      <InspirationGenerator>
        <Copyright year={2004} />
      </InspirationGenerator>
    </>
  );
}

Tree graph with five nodes. Each node represents a component. The root of the tree is App, with two arrows extending from it to 'InspirationGenerator' and 'FancyText'. The arrows are labelled with the word 'renders'. 'InspirationGenerator' node also has two arrows pointing to nodes 'FancyText' and 'Copyright'.

React создает дерево отрисовки, дерево пользовательского интерфейса, составленное из отрисованных компонентов.

Из примера приложения мы можем построить вышеупомянутое дерево отрисовки.

Дерево состоит из узлов, каждый из которых представляет собой компонент. App, FancyText, Copyright, — это лишь некоторые узлы нашего дерева.

Корневой узел в дереве отрисовки React — это корневой компонент приложения. В данном случае корневым компонентом является App, и это первый компонент, который React отрисовывает. Каждая стрелка в дереве указывает от родительского компонента к дочернему компоненту.

Подробный анализ

Где находятся HTML-теги в дереве отрисовки?

Обратите внимание, что в приведенном выше дереве отрисовки нет упоминания HTML-тегов, которые каждый компонент отрисовывает. Это связано с тем, что дерево отрисовки состоит только из React компонентов.

React, как фреймворк пользовательского интерфейса, не зависит от платформы. На react.dev мы демонстрируем примеры, которые отрисовываются в веб-приложении, использующем HTML-разметку в качестве первоначальных элементов пользовательского интерфейса. Но приложение React может быть одинаково успешно отрисовано на мобильной или настольной платформе, которые могут использовать различные первоначальные элементы пользовательского интерфейса, такие как UIView или FrameworkElement.

Эти первоначальные элементы пользовательского интерфейса платформы не являются частью React. Деревья отрисовки React могут обеспечить понимание нашего приложения React независимо от платформы, на которой ваше приложение отрисовывается.

Дерево отрисовки представляет собой один проход отрисовки приложения React. С помощью условной отрисовки родительский компонент может отрисовать разные дочерние элементы в зависимости от передаваемых данных.

Мы можем обновить приложение, чтобы условно отрисовать либо вдохновляющую цитату, либо цвет.

import FancyText from './FancyText';
import InspirationGenerator from './InspirationGenerator';
import Copyright from './Copyright';

export default function App() {
  return (
    <>
      <FancyText title text="Get Inspired App" />
      <InspirationGenerator>
        <Copyright year={2004} />
      </InspirationGenerator>
    </>
  );
}

Tree graph with six nodes. The top node of the tree is labelled 'App' with two arrows extending to nodes labelled 'InspirationGenerator' and 'FancyText'. The arrows are solid lines and are labelled with the word 'renders'. 'InspirationGenerator' node also has three arrows. The arrows to nodes 'FancyText' and 'Color' are dashed and labelled with 'renders?'. The last arrow points to the node labelled 'Copyright' and is solid and labelled with 'renders'.

При условной отрисовке дерево отрисовки может отрисовывать различные компоненты в разных проходах.

В этом примере, в зависимости от того, что inspiration.type является, мы можем отрисовать <FancyText> или <Color>. Дерево отрисовки может отличаться в каждом проходе отрисовки.

Хотя деревья отрисовки могут отличаться в разных проходах отрисовки, эти деревья, как правило, полезны для определения главных и листовых компонентов в приложении React. Главные компоненты находятся ближе к корневому компоненту и влияют на производительность отрисовки всех компонентов под ними и часто содержат большую сложность. Листовые компоненты находятся в нижней части дерева и не имеют дочерних компонентов и часто часто перерисовываются.

Идентификация этих категорий компонентов полезна для понимания потока данных и производительности вашего приложения.

Дерево зависимостей модулей

Еще одни отношения в приложении React, которые можно смоделировать с помощью дерева, — это зависимости модулей приложения. Поскольку мы разбиваем наши компоненты и логику на отдельные файлы, мы создаем JS-модули, где можем экспортировать компоненты, функции или константы.

Каждый узел в дереве зависимостей модулей — это модуль, а каждая ветвь представляет собой оператор import в этом модуле.

Если мы возьмем предыдущее приложение Inspirations, мы можем построить дерево зависимостей модулей или, коротко, дерево зависимостей.

A tree graph with seven nodes. Each node is labelled with a module name. The top level node of the tree is labelled 'App.js'. There are three arrows pointing to the modules 'InspirationGenerator.js', 'FancyText.js' and 'Copyright.js' and the arrows are labelled with 'imports'. From the 'InspirationGenerator.js' node, there are three arrows that extend to three modules: 'FancyText.js', 'Color.js', and 'inspirations.js'. The arrows are labelled with 'imports'.

Дерево зависимостей модулей для приложения Inspirations.

Корневой узел дерева — это корневой модуль, также известный как файл точки входа. Он часто является модулем, содержащим корневой компонент.

В сравнении с деревом отрисовки того же приложения, есть сходные структуры, но и некоторые заметные различия:

  • Узлы, из которых состоит дерево, представляют модули, а не компоненты.
  • Модули, не являющиеся компонентами, такие как inspirations.js, также представлены в этом дереве. Дерево отрисовки охватывает только компоненты.
  • Copyright.js появляется под App.js, но в дереве отрисовки Copyright, компонент, появляется как дочерний компонент InspirationGenerator. Это потому, что InspirationGenerator принимает JSX как пропсы детей, поэтому отрисовывает Copyright как дочерний компонент, но не импортирует модуль.

Деревья зависимостей полезны для определения, какие модули необходимы для запуска вашего приложения React. При создании приложения React для производства обычно выполняется этап сборки, который объединит все необходимые JavaScript-файлы для отправки клиенту. Инструмент, ответственный за это, называется сборщиком, и сборщики используют дерево зависимостей для определения, какие модули следует включить.

По мере роста вашего приложения часто увеличивается и размер пакета. Большие размеры пакетов дорого обходятся клиенту для скачивания и запуска. Большие размеры пакетов могут задерживать время отрисовки вашего пользовательского интерфейса. Понимание дерева зависимостей вашего приложения может помочь в отладке этих проблем.

Резюме

  • Деревья — распространенный способ представления отношений между сущностями. Они часто используются для моделирования пользовательского интерфейса.
  • Деревья отрисовки представляют вложенные отношения между компонентами React в рамках одного прохода отрисовки.
  • При условной отрисовке дерево отрисовки может изменяться при различных проходах отрисовки. При различных значениях свойств компоненты могут отрисовывать различные дочерние компоненты.
  • Деревья отрисовки помогают определить, какие компоненты являются главными и листовыми. Главные компоненты влияют на производительность отрисовки всех компонентов ниже них, а листовые компоненты часто часто перерисовываются. Их идентификация полезна для понимания и отладки производительности отрисовки.
  • Деревья зависимостей представляют зависимости модулей в приложении React.
  • Деревья зависимостей используются инструментами сборки для объединения необходимого кода для отправки приложения.
  • Деревья зависимостей полезны для отладки больших размеров пакетов, которые замедляют время отрисовки, и позволяют выявить возможности оптимизации объединяемого кода.

© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://react.dev/learn/understanding-your-ui-as-a-tree

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API