Tutorial Reagir Parte 15: Workshops sobre o estado dos componentes

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.

imagem

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 componentes
Parte 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 curso

Liçã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 navegador

Lição 28. Oficina. Estado do componente, trabalhe com dados armazenados no estado


Original

Nesta 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:

  1. Transforme-o para que o componente tenha um estado.
  2. 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).
  3. 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 navegador

De 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 navegador

A 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?

Source: https://habr.com/ru/post/pt438988/


All Articles