Hoje, sugerimos que você conclua duas aulas práticas sobre como trabalhar com o estado dos componentes. Em particular, executando as tarefas de hoje, você pode não apenas entender melhor o conceito de propriedades, mas também trabalhar na depuração de aplicativos React nos quais há erros.

→
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 27. Oficina. Depuração do status do componente
→
Original▍Job
Analise o código da classe
App
abaixo no arquivo
App.js
de um aplicativo React padrão criado por
create-react-app
. Este código está incompleto, possui erros.
import React from "react" class App extends Component() { return ( <div> <h1>{this.state.name}</h1> <h3><font color="#3AC1EF">▍{this.state.age} years old</font></h3> </div> ) } export default App
O componente
App
baseado em classe não tem um construtor, seu estado não é inicializado, mas ao formar o que retorna, isso implica que ele possui um estado com alguns dados.
Sua tarefa é trazer esse código para um estado utilizável.
Se você encontrar uma determinada mensagem de erro desconhecida, não se apresse em procurar a solução. Tente, por exemplo, ler atentamente o código e procurar informações sobre o problema na Internet, descubra a causa do erro e corrija-o. O código de depuração é uma habilidade valiosa que você definitivamente precisará quando estiver trabalhando em projetos reais.
▍Solução
O corpo de uma classe é semelhante ao corpo de um componente funcional. Ele contém apenas o comando de
return
, mas em componentes baseados em classes, esse comando é usado no método
render()
e não no corpo da classe. Corrija.
import React from "react" class App extends Component() { render() { return ( <div> <h1>{this.state.name}</h1> <h3><font color="#3AC1EF">▍{this.state.age} years old</font></h3> </div> ) } } export default App
Se continuarmos analisando o código, observando as mensagens de erro exibidas no navegador, podemos entender que, embora a
class App extends Component
construção de
class App extends Component
pareça bastante normal, ainda há algo errado com o que chamamos de nome de
Component
. O problema é que, no comando import,
import React from "react"
, importamos apenas
React
, mas não
Component
, para o projeto. Ou seja, precisamos editar este comando, trazendo-o para o formulário
import React, {Component} from "react"
; em seguida, ao criar a classe, podemos usar o código existente ou reescrever a declaração da classe neste formato:
class App extends React.Component
. Vamos nos concentrar na primeira opção. Agora, o código do componente fica assim:
import React, {Component} from "react" class App extends Component() { render() { return ( <div> <h1>{this.state.name}</h1> <h3><font color="#3AC1EF">▍{this.state.age} years old</font></h3> </div> ) } } export default App
É verdade que os problemas não param por aí. O aplicativo não funciona, uma mensagem de erro
TypeError: Cannot set property 'props' of undefined
aparece no navegador
TypeError: Cannot set property 'props' of undefined
, somos informados de que algo está errado com a primeira linha da declaração de classe.
O ponto aqui é que, ao declarar um componente, que, como já entendemos, é um componente baseado em uma classe, um par de parênteses aparece após o nome da classe pai. Eles não são necessários aqui, este não é um componente funcional, portanto, vamos nos livrar deles. Agora, o código do aplicativo acaba sendo mais ou menos viável, o componente baseado na classe não parece mais completamente errado, mas o sistema continua relatando erros para nós. Agora a mensagem de erro é semelhante a esta:
TypeError: Cannot read property 'name' of null
. Obviamente, refere-se a uma tentativa de usar dados armazenados em um estado de componente que ainda não foi inicializado. Portanto, agora criaremos um construtor de classe sem esquecer de chamar
super()
e inicializaremos o estado do componente adicionando valores a ele com os quais o componente está tentando trabalhar.
Aqui está o código de trabalho final para o componente
App
:
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = { name: "Sally", age: 13 } } render() { return ( <div> <h1>{this.state.name}</h1> <h3><font color="#3AC1EF">▍{this.state.age} years old</font></h3> </div> ) } } export default App
Aqui está a aparência da página do aplicativo em um navegador.
Página do aplicativo no navegadorLição 28. Oficina. Estado do componente, trabalhe com dados armazenados no estado
→
OriginalNesta sessão de prática, você terá outra chance de trabalhar com o estado dos componentes.
▍Job
Abaixo está o código do componente funcional. Com base nisso, faça o seguinte:
- Transforme-o para que o componente tenha um estado.
- O estado do componente deve ter a propriedade
isLoggedIn
, que armazena o valor lógico true
se o usuário estiver conectado e false
se não (no nosso caso, não existem mecanismos de "logon" aqui, o valor correspondente deve ser definido manualmente, quando o estado for inicializado). - Tente garantir que, se o usuário estiver conectado, o componente
You are currently logged in
texto You are currently logged in
e, caso contrário, o texto You are currently logged out
. Essa tarefa é opcional, se você tiver dificuldades em sua implementação, poderá, por exemplo, procurar idéias na Internet.
Aqui está o código para o arquivo
App.js
:
import React from "react" function App() { return ( <div> <h1>You are currently logged (in/out)</h1> </div> ) } export default App
▍Solução
Temos um componente funcional à nossa disposição. Para equipá-lo com estado, ele deve ser transformado em um componente baseado na classe e inicializar seu estado. Aqui está a aparência do código do componente convertido:
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: true } } render() { return ( <div> <h1>You are currently logged (in/out)</h1> </div> ) } } export default App
Verifique a saúde do aplicativo.
Aplicativo no navegadorDe fato, se você chegou a esse ponto, significa que aprendeu o material do curso dedicado aos componentes com base nas classes e no estado dos componentes. Agora estaremos envolvidos em uma tarefa opcional.
Em essência, o que precisamos fazer para concluir esta tarefa será discutido em uma lição que se concentra na renderização condicional; portanto, aqui vamos um pouco adiante. Então, vamos declarar e inicializar uma variável que conterá a string
in
ou
out
dependendo do que é armazenado na
isLoggedIn
estado
isLoggedIn
. Trabalharemos com essa variável no método
render()
, primeiro analisando os dados e gravando o valor desejado e, em seguida, usando-o no código JSX retornado pelo componente. Aqui está o que acabamos com:
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: true } } render() { let wordDisplay if (this.state.isLoggedIn === true) { wordDisplay = "in" } else { wordDisplay = "out" } return ( <div> <h1>You are currently logged {wordDisplay}</h1> </div> ) } } export default App
Observe que a variável
wordDisplay
é uma variável local comum declarada no método
render()
; portanto, para acessá-la nesse método, basta especificar seu nome.
Aqui está a aparência da página do aplicativo:
Página do aplicativo no navegadorA
isLoggedIn
state
isLoggedIn
definida como
true
, portanto, o texto
You are currently logged in
aparece na página. Para exibir o texto
You are currently logged out
precisa alterar, no código do componente, o valor de
isLoggedIn
para
false
.
Note-se que esse problema pode ser resolvido de outras maneiras. Mas o código que obtivemos é claro e eficiente, portanto, vamos continuar com ele, embora, por exemplo, dado que
isLoggedIn
seja uma variável lógica, a condição
if (this.state.isLoggedIn === true)
possa ser reescrita como
if (this.state.isLoggedIn)
.
Sumário
Hoje você praticou o trabalho com o estado dos componentes, em particular, corrigiu erros no código, processou um componente funcional em um componente baseado em classes e se envolveu na renderização condicional. Da próxima vez, você terá outro trabalho prático e um novo tópico.
Caros leitores! Você conseguiu encontrar e corrigir todos os erros completando o primeiro trabalho prático apresentado aqui?
