Compreendendo Sua UI como uma Árvore
Seu aplicativo React está tomando forma com muitos componentes aninhados uns dentro dos outros. Como o React acompanha a estrutura de componentes do seu aplicativo?
React, e muitas outras bibliotecas de UI, modelam a UI como uma árvore. Pensar no seu aplicativo como uma árvore é útil para entender a relação entre os componentes. Essa compreensão ajudará você a depurar conceitos futuros como desempenho e gerenciamento de estado.
Você aprenderá
- Como o React "vê" as estruturas de componentes
- O que é uma árvore de renderização e para que ela serve
- O que é uma árvore de dependência de módulos e para que ela serve
Sua UI como uma árvore
Árvores são um modelo de relacionamento entre itens. A UI é frequentemente representada usando estruturas de árvore. Por exemplo, os navegadores usam estruturas de árvore para modelar HTML (DOM) e CSS (CSSOM). As plataformas móveis também usam árvores para representar sua hierarquia de visualização.


O React cria uma árvore de UI a partir de seus componentes. Neste exemplo, a árvore de UI é então usada para renderizar no DOM.
Assim como navegadores e plataformas móveis, o React também usa estruturas de árvore para gerenciar e modelar o relacionamento entre componentes em um aplicativo React. Essas árvores são ferramentas úteis para entender como os dados fluem através de um aplicativo React e como otimizar a renderização e o tamanho do aplicativo.
A Árvore de Renderização
Uma característica principal dos componentes é a capacidade de compor componentes a partir de outros componentes. Conformeaninhamos componentes, temos o conceito de componentes pai e filho, onde cada componente pai pode, por sua vez, ser um filho de outro componente.
Quando renderizamos um aplicativo React, podemos modelar esse relacionamento em uma árvore, conhecida como árvore de renderização.
Aqui está um aplicativo React que renderiza citações inspiradoras.


O React cria umaárvore de renderização, uma árvore de UI, composta pelos componentes renderizados.
A partir do aplicativo de exemplo, podemos construir a árvore de renderização acima.
A árvore é composta por nós, cada um representando um componente.App,FancyText,Copyright, para citar alguns, são todos nós em nossa árvore.
O nó raiz em uma árvore de renderização do React é ocomponente raizdo aplicativo. Neste caso, o componente raiz éAppe é o primeiro componente que o React renderiza. Cada seta na árvore aponta de um componente pai para um componente filho.
Uma árvore de renderização representa uma única passagem de renderização de um aplicativo React. Com arenderização condicional, um componente pai pode renderizar filhos diferentes dependendo dos dados passados.
Podemos atualizar o aplicativo para renderizar condicionalmente uma citação inspiradora ou uma cor.


Com a renderização condicional, em diferentes renderizações, a árvore de renderização pode renderizar componentes diferentes.
Neste exemplo, dependendo do queinspiration.typefor, podemos renderizar<FancyText>ou<Color>. A árvore de renderização pode ser diferente para cada passagem de renderização.
Embora as árvores de renderização possam diferir entre as passagens de renderização, essas árvores geralmente são úteis para identificar quais são oscomponentes de nível superiore oscomponentes folhaem um aplicativo React. Componentes de nível superior são os componentes mais próximos do componente raiz e afetam o desempenho de renderização de todos os componentes abaixo deles e geralmente contêm a maior complexidade. Componentes folha estão perto da parte inferior da árvore e não têm componentes filhos e são frequentemente re-renderizados com frequência.
Identificar essas categorias de componentes é útil para entender o fluxo de dados e o desempenho do seu aplicativo.
A Árvore de Dependência de Módulos
Outro relacionamento em um aplicativo React que pode ser modelado com uma árvore são as dependências de módulos de um aplicativo. Conformedividimos nossos componentese lógica em arquivos separados, criamosmódulos JSonde podemos exportar componentes, funções ou constantes.
Cada nó em uma árvore de dependência de módulos é um módulo e cada ramo representa uma instruçãoimportnaquele módulo.
Se pegarmos o aplicativo Inspirations anterior, podemos construir uma árvore de dependência de módulos, ou árvore de dependência, para abreviar.


A árvore de dependência de módulos para o aplicativo Inspirations.
O nó raiz da árvore é o módulo raiz, também conhecido como arquivo de entrada. Geralmente é o módulo que contém o componente raiz.
Comparando com a árvore de renderização do mesmo aplicativo, há estruturas semelhantes, mas algumas diferenças notáveis:
- Os nós que compõem a árvore representam módulos, não componentes.
- Módulos que não são componentes, como
inspirations.js, também são representados nesta árvore. A árvore de renderização encapsula apenas componentes. Copyright.jsaparece sobApp.js, mas na árvore de renderização,Copyright, o componente, aparece como um filho deInspirationGenerator. Isso ocorre porqueInspirationGeneratoraceita JSX comoprops children, então ele renderizaCopyrightcomo um componente filho, mas não importa o módulo.
As árvores de dependência são úteis para determinar quais módulos são necessários para executar seu aplicativo React. Ao construir um aplicativo React para produção, normalmente há uma etapa de build que agrupará todo o JavaScript necessário para enviar ao cliente. A ferramenta responsável por isso é chamada debundler, e os bundlers usarão a árvore de dependência para determinar quais módulos devem ser incluídos.
À medida que seu aplicativo cresce, o tamanho do bundle geralmente também cresce. Bundles grandes são caros para o cliente baixar e executar. Bundles grandes podem atrasar o tempo para sua interface do usuário ser desenhada. Ter uma noção da árvore de dependência do seu aplicativo pode ajudar a depurar esses problemas.
Recapitulação
- Árvores são uma forma comum de representar a relação entre entidades. Elas são frequentemente usadas para modelar a interface do usuário.
- Árvores de renderização representam a relação aninhada entre componentes React em uma única renderização.
- Com renderização condicional, a árvore de renderização pode mudar entre diferentes renderizações. Com diferentes valores de props, os componentes podem renderizar diferentes componentes filhos.
- Árvores de renderização ajudam a identificar quais são os componentes de nível superior e os componentes folha. Componentes de nível superior afetam o desempenho de renderização de todos os componentes abaixo deles, e componentes folha são frequentemente re-renderizados com frequência. Identificá-los é útil para entender e depurar o desempenho de renderização.
- Árvores de dependência representam as dependências de módulos em um aplicativo React.
- Árvores de dependência são usadas por ferramentas de build para agrupar o código necessário para enviar um aplicativo.
- Árvores de dependência são úteis para depurar tamanhos grandes de bundle que atrasam o tempo de pintura e expõem oportunidades para otimizar qual código é agrupado.
