Estamos publicando a próxima parte da tradução do curso de treinamento do React. Nosso tópico hoje será o relacionamento entre os componentes pai e filho.

→
Parte 1: visão geral do curso, razões para a popularidade do React, ReactDOM e JSX→
Parte 2: componentes funcionais→
Parte 3: arquivos de componentes, estrutura do projeto→
Parte 4: componentes pai e filho→
Parte 5: início do trabalho em um aplicativo TODO, noções básicas de estilo→
Parte 6: sobre alguns recursos do curso, JSX e JavaScript→
Parte 7: estilos embutidos→
Parte 8: trabalho contínuo na aplicação TODO, familiaridade com as propriedades dos componentes→
Parte 9: propriedades do componente→
Parte 10: Workshop sobre como trabalhar com propriedades e estilo de componentes→
Parte 11: geração dinâmica de marcação e método de matrizes de mapas→
Parte 12: workshop, terceira etapa do trabalho em uma aplicação TODO→
Parte 13: componentes baseados em classe→
Parte 14: workshop sobre componentes baseados em classe, status dos componentes→
Parte 15: oficinas de saúde componentes→
Parte 16: a quarta etapa do trabalho em um aplicativo TODO, manipulação de eventos→
Parte 17: quinta etapa do trabalho em um aplicativo TODO, modificando o estado dos componentes→
Parte 18: a sexta etapa do trabalho em um aplicativo TODO→
Parte 19: métodos do ciclo de vida dos componentesParte 20: a primeira lição sobre renderização condicional→
Parte 21: segunda lição e workshop sobre renderização condicional→
Parte 22: sétima etapa do trabalho em um aplicativo TODO, baixando dados de fontes externas→
Parte 23: primeira lição sobre como trabalhar com formulários→
Parte 24: Segunda lição sobre formulários→
Parte 25: Workshop sobre como trabalhar com formulários→
Parte 26: arquitetura do aplicativo, padrão Container / Component→
Parte 27: projeto do cursoLição 9. Componentes pai e filho
→
OriginalHoje falaremos sobre componentes pai e filho. O uso de tais construções tornará nosso aplicativo muito mais complexo do que quando havia apenas um componente de saída no DOM, como
MyInfo
. Em vez dessa estrutura simples, o aplicativo pode ter uma hierarquia complexa de componentes que, como resultado, é convertida em elementos JSX.
Vamos começar com o modelo de aplicativo que você já conhece. Para recuperar o que
index.js
, você pode, de memória, escrever um código no arquivo
index.js
vazio para exibir a página de cabeçalho de primeiro nível com o texto
Hello World!
Reagir ferramentas. Aqui está a aparência do código:
import React from "react" import ReactDOM from "react-dom" ReactDOM.render( <h1>Hello World!</h1>, document.getElementById("root") )
A última vez em que a descrição do elemento
<h1>
está no código acima, havia um código para exibir o componente
MyInfo
. Agora vamos criar o componente
App
e exibi-lo. Para fazer isso, precisamos de um código do seguinte formato:
import React from "react" import ReactDOM from "react-dom" ReactDOM.render( <App />, document.getElementById("root") )
O componente
App
será o ponto de entrada para o nosso aplicativo. Você provavelmente já percebeu que faltava algo no código do exemplo anterior. Isso é verdade - ainda não importamos o
App
aqui. Vamos fazer isso:
import React from "react" import ReactDOM from "react-dom" import App from "./App" ReactDOM.render( <App />, document.getElementById("root") )
Mas esse código ainda permanece inoperante. Precisamos do arquivo de componente do
App
(
App.js
) localizado na mesma pasta que o
index.js
. Este é o arquivo ao qual nos referimos no
import App from "./App"
comando
import App from "./App"
. Lembre-se de que os nomes dos componentes do React estão escritos em estilo camelo e começam com uma letra maiúscula. Crie o arquivo que precisamos e descreva o componente
App
nele. Tente fazer você mesmo. Ou seja, escreva o código graças ao qual o componente
App
exibe
Hello again
na página.
Aqui está a aparência desse código:
import React from "react" function App(){ return ( <h1>Hello again</h1> ) } export default App
Aqui, a função
App
retorna um único elemento, mas lembre-se de que estruturas mais complexas podem ser retornadas a partir de funções semelhantes. O mais importante é não esquecer que você pode retornar apenas um elemento que, se, de fato, precisar exibir vários elementos, é um contêiner que os inclui. Por exemplo, veja como seria um retorno de marcação descrevendo um cabeçalho de primeiro nível e uma lista de marcadores:
import React from "react" function App(){ return ( <div> <h1>Hello a third time!</h1> <ul> <li>Thing 1</li> <li>Thing 2</li> <li>Thing 3</li> </ul> </div> ) } export default App
Talvez agora possamos decidir que o que é formado por meio do componente
App
deve ser um site. Ele terá um bloco de navegação (
<nav></nav>
) e uma área de conteúdo principal (
<main></main>
). Esta solução levará à formação do seguinte código:
import React from "react" function App(){ return ( <div> <nav> <h1>Hello a third time!</h1> <ul> <li>Thing 1</li> <li>Thing 2</li> <li>Thing 3</li> </ul> </nav> <main> <p>This is where most of my content will go...</p> </main> </div> ) } export default App
É assim que ficará em um navegador.
Aplicativo no navegadorAqui você ainda pode estilizar a lista para que ela se pareça mais com uma barra de navegação.
Você pode perceber que o código do componente já se tornou bastante grande. Isso vai contra o propósito para o qual usamos o React. Anteriormente, falamos sobre o fato de que fragmentos de código HTML podem ser representados como componentes separados, e em nosso componente tudo é empilhado em uma pilha. Portanto, agora criaremos componentes para cada fragmento independente da marcação.
Dê uma olhada neste diagrama para entender melhor o que está em jogo.
O componente App exibe o componente MyInfo, a saída do elemento <div>Aqui, exibimos o componente
App
na página. Nesse caso, o componente
App
decide exibir outro componente -
MyInfo
. E o componente
MyInfo
já exibe um determinado elemento JSX. Preste atenção à diferença entre os conceitos de "componente" e "elemento". Elementos são entidades que se transformam em código HTML comum. Portanto, no elemento apresentado na parte inferior do diagrama, uma simples tag
<div>
é usada, seu nome começa com uma letra minúscula, o que nos diz que esse é um elemento comum e não um dos componentes que criamos. Por outro lado, o nome
MyInfo
começa com uma letra maiúscula. Isso ajuda a entender que temos um componente.
Você pode ter ouvido falar que o DOM (Modelo de Objeto de Documento, geralmente chamado de "árvore"). O elemento raiz desta árvore é o elemento
<html>
. No nosso caso, o elemento raiz da árvore representada no diagrama é o componente
App
. As capacidades deste componente não se limitam à saída de outro componente,
MyInfo
no nosso caso. Pode, por exemplo, exibir outro componente, que é um "rodapé", na parte inferior da página. Digamos que esse componente será chamado
AwesomeFooter
.
O aplicativo Component gera dois componentesEste componente, por sua vez, pode gerar um elemento
<footer>
que conterá o código HTML na parte inferior da página.
Se tivermos um "rodapé" de uma página, ela também poderá conter um "cabeçalho", que forma sua parte superior.
Aplicativo de componente gera três componentesA parte superior da página é representada em nosso diagrama pelo componente
AwesomeHeader
. Esses nomes são dados a esses componentes para não confundi-los com os elementos. O componente
AwesomeHeader
, como o componente
App
, pode gerar não apenas a marcação JSX, mas também outros componentes. Por exemplo, pode ser um componente
NavBar
, que é uma barra de navegação, e um componente
Logo
que exibe um logotipo. E esses componentes já exibirão elementos comuns - como
<img />
e
<nav>
.
Ao revisar esse esquema, você pode perceber que um aplicativo React, à medida que se desenvolve, pode se tornar cada vez mais complexo. E o que examinamos aqui é, de fato, um exemplo de uma estrutura de aplicativo extremamente simples.
Agora vamos criar um componente em nosso aplicativo de treinamento que será um "rodapé" da página.
Para fazer isso, crie, na mesma pasta que o arquivo
index.js
, um novo arquivo.
Footer.js
-o de
Footer.js
e coloque o seguinte código:
import React from "react" function Footer() { return ( <footer> <h3><font color="#3AC1EF">▍This is my footer element</font></h3> </footer> ) } export default Footer
Observe que o nome do componente funcional começa com uma letra maiúscula (
Footer
) e o nome do elemento
(<footer>
) começa com uma letra pequena. Como já mencionado, isso ajuda a distinguir elementos de componentes.
Se você agora atualizar a página, a marcação gerada pelo componente
Footer
não será exibida na parte inferior. Isso é completamente esperado, pois para exibi-lo, é necessário fazer as alterações apropriadas no código do componente do
App
.
Ou seja, estamos falando sobre o fato de que, no código do arquivo do componente
App
, você precisa importar o componente
Footer
e criar uma instância dele. Edite o código para o arquivo
App.js
:
import React from "react" import Footer from "./Footer" function App(){ return ( <div> <nav> <h1>Hello a third time!</h1> <ul> <li>Thing 1</li> <li>Thing 2</li> <li>Thing 3</li> </ul> </nav> <main> <p>This is where most of my content will go...</p> </main> <Footer /> </div> ) } export default App
Agora, a página que os formulários de inscrição terão a aparência mostrada abaixo.
O componente App exibe a marcação formada por outro componente na parte inferior da página - RodapéVocê pode perceber que agora na saída de código do componente
App
há uma estranha mistura de elementos JSX comuns com componentes. Seria muito melhor se o que o componente
App
exibir fosse como um sumário de um livro, para que ele contenha principalmente componentes. Ou seja, o ponto é que o código do componente seria algo como isto:
import React from "react" import Footer from "./Footer" function App() { return ( <div> <Header /> <MainContent /> <Footer /> </div> ) } export default App
Se o aplicativo tiver uma estrutura semelhante (no nosso caso, como os arquivos dos componentes
Header
e
MainContent
ainda não foram criados, o código não funcionará), a descrição dos elementos que formam as várias partes da página estará nos arquivos dos componentes correspondentes. Ao mesmo tempo, os componentes importados para o componente
App
podem conter outros componentes aninhados. Assim, estruturas extensas podem ser formadas, cujas dimensões são determinadas pelas necessidades de uma aplicação específica.
Aqui falamos sobre como trabalhar com componentes aninhados. Você pode muito bem tentar praticar o que acabou de aprender, trazendo o projeto,
App.js
arquivo
App.js
parece como mostrado acima, para a condição de trabalho.
Lição 10. Oficina. Componentes pai e filho
→
Original▍Job
Crie um aplicativo React do zero. Exiba o componente raiz do
App
(definido em um arquivo separado) na página. Imprima os seguintes componentes dentro deste componente:
Navbar
MainContent
Footer
Os componentes exibidos pelo
App
devem ser descritos em arquivos separados, cada um deles deve gerar alguns elementos JSX.
▍Solução
Como base para resolver esse problema, é usado um projeto padrão criado usando as ferramentas
create-react-app
(se você não souber como criar esse projeto, dê uma olhada
neste material). Ele usa o
index.html
padrão.
O código para o arquivo
index.js
:
import React from "react" import ReactDOM from "react-dom" import App from "./App" ReactDOM.render( <App />, document.getElementById("root") )
Aqui está o código para o arquivo
App.js
Observe que usaremos a pasta de
components
para armazenar os arquivos de componentes.
import React from "react" import Header from "./components/Header" import MainContent from "./components/MainContent" import Footer from "./components/Footer" function App() { return ( <div> <Header /> <MainContent /> <Footer /> </div> ) } export default App
O código para o arquivo
Header.js
:
import React from "react" function Header() { return ( <header>This is the header</header> ) } export default Header
MainContent.js
arquivo
MainContent.js
:
import React from "react" function MainContent() { return ( <main>This is the main section</main> ) } export default MainContent
Código do arquivo
Footer.js
:
import React from "react" function Footer() { return ( <footer>This is the footer</footer> ) } export default Footer
Você pode organizar o trabalho com os componentes como desejar. Ou seja, é possível, por exemplo, primeiro gravar todo o código necessário no arquivo
App.js
que importa os componentes e exibe suas instâncias e, em seguida, cria os arquivos de componentes. Você pode fazer o oposto - primeiro crie arquivos de componentes com código e trabalhe no arquivo
App.js
O mais importante é que você termine com um aplicativo em funcionamento.
É assim que o projeto se parece no VSCode.
Projeto no VSCodeE aqui está a página que esse aplicativo formou.
Página do aplicativo no navegadorNosso aplicativo React funciona, mas o que é exibido na página parece completamente desinteressante. Você pode corrigir isso estilizando o conteúdo da página.
Sumário
Hoje falamos sobre componentes pai e filho. Da próxima vez, começaremos a trabalhar em nosso primeiro grande projeto de treinamento e falaremos sobre os elementos da página de estilo.
Caros leitores! Se você está envolvido neste curso, conte-nos como você realiza exercícios práticos. Ou seja - você escreve o código chamado "da cabeça" ou olha o texto da lição anterior? Ou talvez você esteja tentando encontrar o que esqueceu na Internet?
