Tutorial Reagir Parte 14: Workshop sobre componentes baseados em classe, status do componente

Nesta parte da tradução do curso de treinamento do React, sugerimos que você conclua a tarefa prática de trabalhar com componentes baseados em classe. Depois disso, começaremos a dominar um conceito tão importante de React como o estado dos componentes.

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 25. Oficina. Componentes Baseados em Classe


Original

▍Job


Abaixo está o código que precisa ser colocado no arquivo index.js de um aplicativo React padrão criado por create-react-app . Converta os componentes funcionais que você encontrará neste código em componentes baseados em classe e, além disso, encontre e corrija um pequeno erro.

O código para o arquivo index.js :

 import React from "react" import ReactDOM from "react-dom" // #1 function App() {   return (       <div>           <Header />           <Greeting />       </div>   ) } // #2 function Header(props) {   return (       <header>           <p>Welcome, {props.username}!</p>       </header>   ) } // #3 function Greeting() {   const date = new Date()   const hours = date.getHours()   let timeOfDay     if (hours < 12) {       timeOfDay = "morning"   } else if (hours >= 12 && hours < 17) {       timeOfDay = "afternoon"   } else {       timeOfDay = "night"   }   return (       <h1>Good {timeOfDay} to you, sir or madam!</h1>   ) } ReactDOM.render(<App />, document.getElementById("root")) 

▍Solução


Primeiro, vejamos o que o aplicativo fornece em sua forma original abrindo-o em um navegador.


Página de origem do navegador

Você pode ver que a linha superior que aparece na página não parece correta. Após a vírgula que segue o Welcome, obviamente deve haver algo como um nome de usuário.

Se analisarmos o código do aplicativo, verifica-se que o componente Header exibe essa linha, esperando obter a propriedade de username que é definida ao criar sua instância. Uma instância deste componente é criada no componente App . Tendo descoberto isso, poderemos corrigir o mesmo erro mencionado na designação.

Deve-se notar que os componentes geralmente são colocados em arquivos diferentes, mas, neste caso, os descrevemos todos em um arquivo.

Passamos a transformar o componente funcional do App em um componente com base na classe. Para fazer isso, basta trazer seu código para este formulário:

 class App extends React.Component {   render() {       return (           <div>               <Header username="vschool"/>               <Greeting />           </div>       )   } } 

Agora a palavra-chave da class vem antes do nome do componente, seguida pelo extends React.Component , após o qual o corpo da classe é descrito entre colchetes. Deve haver um método render() retornando o que retornamos do componente funcional. Outros componentes são processados ​​da mesma maneira. Preste atenção na construção de <Header username="vschool"/> . Aqui, passamos a propriedade username com o valor de vschool componente Header , corrigindo o erro que está no aplicativo original.

Como você já sabe, o componente Header espera obter a propriedade username , e no componente funcional essa propriedade é acessada usando a construção props.username ( props , nesse caso, é um argumento para a função que descreve o componente). Nos componentes baseados em classe, o mesmo se parece com this.props.username . Aqui está o código reprojetado para o componente Header :

 class Header extends React.Component {   render() {       return (           <header>               <p>Welcome, {this.props.username}!</p>           </header>       )   } } 

O terceiro componente, Greeting , é um pouco diferente dos outros. O fato é que, antes do comando de return , alguns cálculos são realizados. Ao convertê-lo em um componente com base em uma classe, esses cálculos devem ser colocados no método render() antes do comando de retorno. Aqui está o código para o componente Greeting reprojetado:

 class Greeting extends Component {   render() {       const date = new Date()       const hours = date.getHours()       let timeOfDay             if (hours < 12) {           timeOfDay = "morning"       } else if (hours >= 12 && hours < 17) {           timeOfDay = "afternoon"       } else {           timeOfDay = "night"       }       return (           <h1>Good {timeOfDay} to you, sir or madam!</h1>       )   } } 

Observe que este componente foi usado na declaração deste componente: a class Greeting extends Component . Isso geralmente é feito por questões de brevidade, mas, para que isso funcione, precisamos refinar o comando de importação react , trazendo-o para este formato:

 import React, {Component} from "react" 

Veja como é a página do aplicativo reciclado em um navegador.


Página de aplicativo redesenhada no navegador

Na verdade, parece o mesmo que a página do aplicativo original, e a única diferença perceptível entre essas páginas é que o nome de usuário passado para o componente Header agora é exibido na primeira linha.

Aqui está o código completo para o arquivo index.js processado:

 import React, {Component} from "react" import ReactDOM from "react-dom" // #1 class App extends React.Component {   render() {       return (           <div>               <Header username="vschool"/>               <Greeting />           </div>       )   } } // #2 class Header extends React.Component {   render() {       return (           <header>               <p>Welcome, {this.props.username}!</p>           </header>       )   } } // #3 class Greeting extends Component {   render() {       const date = new Date()       const hours = date.getHours()       let timeOfDay             if (hours < 12) {           timeOfDay = "morning"       } else if (hours >= 12 && hours < 17) {           timeOfDay = "afternoon"       } else {           timeOfDay = "night"       }       return (           <h1>Good {timeOfDay} to you, sir or madam!</h1>       )   } } ReactDOM.render(<App />, document.getElementById("root")) 

Se a implementação desta tarefa prática não lhe causou dificuldades - ótimo. Se você ainda não se sente bem com componentes baseados em classes, experimente-os. Por exemplo, você pode refazer os componentes baseados em classe novamente em componentes funcionais e executar a transformação inversa.

Lição 26. Status do Componente


Original

Estado é um conceito React incrivelmente importante. Se o componente precisar armazenar seus próprios dados e gerenciar esses dados (em contraste com a situação em que o componente pai transfere dados para ele usando o mecanismo de propriedade), use o estado do componente. Hoje, examinamos os conceitos básicos sobre o estado dos componentes.

Um estado é apenas os dados que o componente controla. Em particular, isso significa que o componente pode alterar esses dados. Ao mesmo tempo, as propriedades que já são familiares para nós, obtidas pelo componente do componente pai, não podem ser alteradas pelo componente receptor. Eles, de acordo com a documentação do React, são imutáveis ​​(imutáveis). Por exemplo, se tentarmos, em um componente baseado em uma classe, usar uma construção como this.props.name = "NoName" , encontraremos uma mensagem de erro.

Deve-se notar que, se algum componente precisar trabalhar com o estado, deverá ser um componente com base na classe. Vamos falar sobre como equipar o componente com o estado iniciando com o seguinte fragmento de código, que é o conteúdo do arquivo App.js de um projeto padrão criado por create-react-app App.js create-react-app :

 import React from "react" class App extends React.Component {   render() {       return (           <div>               <h1>Is state important to know?</h1>           </div>       )   } } export default App 

É assim que a página do aplicativo se parece em um navegador.


Página do aplicativo no navegador

Para equipar um componente com o estado, você primeiro precisa criar um construtor de classe. Parece um método de classe constructor() . Depois disso, o código do componente ficará assim:

 class App extends React.Component {   constructor() {         }     render() {       return (           <div>               <h1>Is state important to know?</h1>           </div>       )   } } Constructor() 

Este é um método especial incorporado ao JavaScript, projetado para criar e inicializar objetos com base em classes. Na verdade, se você precisar inicializar algo ao criar um objeto, as operações correspondentes serão executadas exatamente no método constructor() .

A primeira coisa a fazer no código do construtor é chamar o construtor da classe pai. Isso é feito usando a função super() . No construtor da classe pai, certas operações de inicialização podem ser executadas, cujos resultados serão úteis para o nosso objeto. Aqui está a aparência do nosso construtor de classe:

 constructor() {   super() } 

Agora, para equipar o componente com state, precisamos, no construtor, adicionar a propriedade state à instância da classe. Esta propriedade é um objeto:

 constructor() {   super()   this.state = {} } 

Aqui nós o inicializamos com um objeto vazio. Você pode trabalhar com o estado no código do componente usando a construção this.state . Adicione uma nova propriedade ao estado:

 constructor() {   super()   this.state = {       answer: "Yes"   } } 

Agora vamos pensar em como usar o que está armazenado no estado no código. Lembre-se de que o componente exibe a pergunta Is state important to know? . O estado armazena a resposta para esta pergunta. Para adicionar esta resposta após a pergunta, você precisa fazer o mesmo que normalmente fazemos adicionando construções JavaScript ao código JSX. Ou seja, adicione a construção {this.state.answer} ao final da linha. Como resultado, o código completo do componente ficará assim:

 class App extends React.Component {   constructor() {       super()       this.state = {           answer: "Yes"       }   }     render() {       return (           <div>               <h1>Is state important to know? {this.state.answer}</h1>           </div>       )   } } 

E aqui está como a página do aplicativo ficará no navegador.


Página do aplicativo no navegador

Aqui, gostaria de observar que o estado que o componente recebe durante a inicialização pode ser alterado durante a operação do componente. Além disso, os componentes podem passar do estado para os componentes descendentes usando o mecanismo de trabalhar com propriedades que você já conhece. Por exemplo, no nosso caso, se assumirmos que existe um determinado componente de ChildComponent , os dados do estado podem ser transferidos para ele assim:

 <ChildComponent answer={this.state.answer}/> 

Embora não falemos detalhadamente sobre como alterar os dados armazenados no estado do componente. Observamos apenas que quando você chama o método setState() , usado para resolver esse problema, não apenas o estado do componente será alterado, mas também os dados do estado transmitidos pelo mecanismo de propriedade para seus componentes filhos serão atualizados. Além disso, a alteração do estado fará com que os dados do estado exibido na página do aplicativo sejam alterados automaticamente.

Sumário


Hoje você teve a oportunidade de trabalhar com componentes baseados em classe. Além disso, sua introdução ao conceito de status do componente começou aqui. Da próxima vez, você encontrará tarefas práticas para trabalhar com o estado.

Caros leitores! Se você usar o React na prática, informe-nos sobre como você gerencia o estado dos componentes. Você usa ferramentas padrão do React ou algo mais?

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


All Articles