React.js: um guia para iniciantes

O autor do artigo, cuja tradução estamos publicando, acredita que, infelizmente, a maioria dos guias do React existentes não presta a devida atenção às valiosas técnicas de desenvolvimento prático. Esses guias nem sempre dão à pessoa envolvida um entendimento sobre qual é a “abordagem correta” para trabalhar com o React.

imagem

Este tutorial, destinado a começar desenvolvedores com conhecimento de HTML, JavaScript e CSS, abordará os conceitos básicos do React e os erros mais comuns que um programador usando esta biblioteca pode encontrar.

Por que os desenvolvedores da Web escolhem React?


Antes de começarmos a trabalhar, digamos algumas palavras sobre por que o React pode ser considerado a melhor alternativa entre as ferramentas para o desenvolvimento de interfaces da web. Existem muitas estruturas de interface do usuário. Por que escolher reagir? Para responder a essa pergunta, vamos comparar as duas ferramentas de desenvolvimento de interface mais populares - React e Angular. Deve-se observar que a estrutura do Vue.js., que está ganhando popularidade, pode ser incluída nessa comparação, mas nos restringiremos a React e Angular.

Abordagem declarativa da descrição de interfaces


O desenvolvimento do React consiste em descrever o que precisa ser exibido na página (e não em compilar instruções para o navegador sobre como fazer isso). Isso, entre outras coisas, significa uma redução significativa na quantidade de código padrão.

A Angular, por outro lado, possui ferramentas de linha de comando que geram código de componente padrão. Isso parece um pouco diferente do que você pode esperar das ferramentas modernas de desenvolvimento de interface? De fato, estamos falando sobre o fato de haver tanto código de modelo no Angular que, para gerá-lo, até mesmo uma ferramenta especial foi criada.

No React, começando a se desenvolver, eles apenas começam a escrever o código. Não há código de componente padrão que precise ser gerado de alguma forma. Obviamente, é necessária alguma preparação antes do desenvolvimento, mas quando se trata de componentes, eles podem ser descritos como funções puras.

▍ Sintaxe clara


O código angular usa diretivas como ng-model , ngIf e ngFor . Esse código parece bastante complicado. React, por outro lado, usa a sintaxe JSX, que é percebida como HTML comum, ou seja, para iniciar o desenvolvimento do React, você não precisa aprender coisas fundamentalmente novas. Aqui está o que parece:

 const Greetings = ({ firstName }) => (  <div>Hi, {firstName}</div> ); 

Curve Curva de aprendizado correta


A curva de aprendizado é um fator importante a ser considerado ao escolher uma estrutura de interface do usuário. Nesse sentido, deve-se notar que há menos abstrações no React do que no Angular. Se você conhece JavaScript, provavelmente pode aprender a escrever aplicativos React literalmente em um dia. Obviamente, para aprender como fazer isso da maneira certa, levará algum tempo, mas você poderá trabalhar muito, muito rapidamente.

Se você analisar o Angular, verifica-se que, se você decidir dominar essa estrutura, precisará aprender uma nova linguagem (o Angular usa o TypeScript), além de aprender a usar as ferramentas de linha de comando Angular e se acostumar a trabalhar com diretivas.

▍ Recursos do mecanismo de ligação de dados


Angular possui um sistema de ligação de dados bidirecional. Isso, por exemplo, é expresso no fato de que alterações na forma de um elemento levam à atualização automática do estado do aplicativo. Isso complica a depuração e é uma grande desvantagem dessa estrutura. Com essa abordagem, se algo der errado, o programador não pode saber exatamente o que exatamente causou o aplicativo mudar de estado.

O React, por outro lado, usa ligação de dados unidirecional. Esta é uma grande vantagem dessa biblioteca, pois está expressa no fato de que o programador sempre sabe exatamente o que levou à mudança no estado do aplicativo. Essa abordagem para ligação de dados simplifica bastante a depuração de aplicativos.

Abordagem funcional do desenvolvimento


Acredito que um dos pontos fortes do React é o fato de que essa biblioteca não força o desenvolvedor a usar classes. No Angular, todos os componentes devem ser implementados como classes. Isso leva à complexidade excessiva do código, sem dar vantagens.

No React, todos os componentes da interface do usuário podem ser expressos como conjuntos de funções puras. O uso de funções puras para formar uma interface do usuário pode ser comparado a uma lufada de ar limpo.

Agora que examinamos os motivos da popularidade do React, que, possivelmente, o levará a essa biblioteca específica ao escolher ferramentas para o desenvolvimento de interfaces de usuário, vamos continuar praticando.

Reagir a prática de desenvolvimento de aplicativos


▍Node.js


O Node.js é uma plataforma de servidor que suporta a execução de código JavaScript, cujos recursos são úteis para o desenvolvimento do React. Se você ainda não instalou esta plataforma, agora é a hora de corrigi-la .

▍Preparação do projeto


Aqui, usaremos o pacote create-react-app do Facebook para criar o núcleo do aplicativo React. Essa é provavelmente a abordagem mais popular para configurar um ambiente de trabalho, que permite iniciar o desenvolvimento. Graças ao create-react-app programador coloca à sua disposição muitas ferramentas necessárias, o que elimina a necessidade de selecioná-las.

Para instalar o create-react-app , use este comando:

 npm i -g create-react-app 

Em seguida, para criar o modelo do aplicativo, execute o seguinte comando:

 create-react-app react-intro 

Esta preparação preliminar está concluída. Para iniciar o aplicativo, execute os seguintes comandos:

 cd react-intro npm start 

Aqui vamos para a pasta do projeto e lançamos o servidor de desenvolvimento, que permite abrir um novo aplicativo React acessando o navegador em http: // localhost: 3000 / .

▍ Estrutura do projeto


Vamos descobrir como o aplicativo React funciona. Para fazer isso, abra o projeto que você acabou de criar usando seu IDE (eu recomendo o Visual Studio Code ).

Arquivo Index.html


Na pasta do projeto, abra o arquivo localizado em public/index.html . Aqui está o que você verá fazendo isso.


Arquivo Index.html

Aqui estamos particularmente interessados ​​na linha <div id="root"> . É aqui que nosso aplicativo React estará localizado. Todo esse elemento será substituído pelo código do aplicativo e tudo o mais permanecerá inalterado.

Arquivo Index.js


Agora abra o src/index.js . Esse arquivo é o que implementa o aplicativo React. E, a propósito, o código fonte do aplicativo será colocado no diretório src .


Arquivo Index.js

Aqui está a linha de código responsável pela saída do que chamamos de "aplicativo React" para a página:

 ReactDOM.render(<App />, document.getElementById('root')); 

Essa linha informa ao React que precisamos pegar o componente App (falaremos sobre isso muito em breve) e colocá-lo na root div , definida no arquivo index.html que acabamos de examinar.

Agora vamos lidar com a construção <App /> . É muito semelhante ao código HTML, mas é uma amostra do código JSX, que é uma sintaxe especial do JavaScript usada pelo React. Observe que essa construção começa com uma letra maiúscula A , que é exatamente <App /> , e não <app /> . Isso ocorre devido à convenção de nomenclatura da entidade usada no React. Essa abordagem permite ao sistema distinguir entre tags HTML regulares e componentes React. Se os nomes dos componentes não estiverem em maiúsculas, o React não poderá exibi-los na página.

Se você planeja usar JSX em um determinado arquivo .js , é necessário importar o React usando o seguinte comando:

 import React from 'react'; 

Arquivo App.js


Agora estamos prontos para dar uma olhada no código do nosso primeiro componente. Para fazer isso, abra o src/App.js


Arquivo App.js

Para criar um componente React, você deve primeiro criar uma classe que seja descendente de React.Component . É exatamente isso que a class App extends Component linha class App extends Component resolve. Todos os componentes do React devem conter uma implementação do método de render , na qual, como você pode imaginar pelo nome, o componente é renderizado e uma descrição de sua representação visual é gerada. Este método deve retornar a marcação HTML para saída na página.

Observe que o atributo className é o equivalente ao atributo de class em HTML. É usado para atribuir classes CSS a elementos para estilizá-las. A class palavra-chave JavaScript é reservada e não pode ser usada como um nome de atributo.

Vamos repetir o que acabamos de descobrir sobre os componentes:

  1. Seus nomes começam com uma letra maiúscula ( A no App ).
  2. Eles estendem a classe React.Component .
  3. Eles devem implementar um método de render que retorna a marcação.

Agora vamos falar sobre o que evitar ao desenvolver aplicativos React.

No. Recomendação nº 1: não é necessário usar classes de componentes em qualquer lugar


Os componentes do React podem ser criados usando duas abordagens. O primeiro é usar classes de componentes (Componente de Classe), o segundo é usar componentes funcionais (Componente Funcional). Como você deve ter notado, o exemplo acima usa classes. Infelizmente, a maioria dos tutoriais para iniciantes do React sugere usá-los.

O que há de errado em descrever componentes usando o mecanismo de classe? O fato é que esses componentes são difíceis de testar e tendem a crescer excessivamente. Esses componentes estão sujeitos ao problema de separação de responsabilidades de baixa qualidade, misturando lógica e apresentação visual (e isso complica a depuração e o teste de aplicativos). Em geral, o uso de classes de componentes leva ao fato de que o programador, figurativamente falando, "se atira no pé". Portanto, especialmente quando se trata de programadores iniciantes, eu recomendaria que eles não usassem classes de componentes.

Então, descobrimos que usar classes para descrever componentes não é uma boa ideia. Que alternativas temos? A resposta a esta pergunta são componentes funcionais. Se o componente criado usando a classe não tiver nada além do método de render , ele será um excelente candidato para processá-lo em um componente funcional. Armado com essa idéia, vamos pensar em como melhorar o componente App criado pela ferramenta create-react-app :

 function App() { return (   <div className="App">     ...   </div> ); } export default App; 

Viu o que fizemos aqui? Nomeadamente, removemos a classe e substituímos o método render por uma construção da function App() {...} formulário function App() {...} . Se usarmos a sintaxe da função de seta ES6 aqui, nosso código ficará ainda melhor:

 const App = () => ( <div className="App">   ... </div> ); export default App; 

Transformamos a classe em uma função que retorna a marcação que precisa ser exibida na página.

Considere isso. Uma função que retorna a marcação não possui código padrão. Isso é marcação quase pura. Isso não é perfeito?

O código dos componentes funcionais é muito mais fácil de ler, trabalhando com eles, você precisa se distrair muito com os designs padrão.

Deve-se notar aqui que, embora tenhamos acabado de dizer que os componentes funcionais são preferíveis às classes de componentes, neste artigo usaremos principalmente classes, uma vez que o código das classes de componentes se mostra mais compreensível para iniciantes, depende de menos abstrações, com É mais fácil demonstrar os principais conceitos do React. Mas quando você estiver suficientemente familiarizado com o desenvolvimento de aplicativos React, é altamente recomendável levar em consideração, ao desenvolver projetos reais, o que foi dito acima. Para entender melhor os componentes funcionais - dê uma olhada neste material .

▍ Familiaridade com propriedades


Propriedades (adereços) é um dos conceitos centrais do React. O que são "propriedades"? Para entender isso, lembre-se dos parâmetros que são passados ​​para as funções. Em essência, propriedades são os parâmetros que são passados ​​para os componentes. Considere o seguinte código:

 const Greetings = (props) => <div>Hey you! {props.firstName} {props.lastName}!</div>; const App = () => ( <div>   <Greetings firstName="John" lastName="Smith" /> </div> ); 

Aqui, criamos o componente Greetings e o usamos para cumprimentar um homem chamado John Smith do componente App . Todo esse código resultará na seguinte marcação HTML:

 <div>  <div>Hey you! John Smith!</div> </div> 

Chaves entre expressões em {props.name} são usadas para destacar o código JavaScript. O componente Greetings é passado, na forma de parâmetros, as propriedades firstName e lastName . Trabalhamos com eles, nos referindo às propriedades do objeto props .

Observe que um único objeto de lastName é props , não dois valores que representam as propriedades firstName e lastName .

O código pode ser simplificado aproveitando a capacidade do ES6 de reestruturar objetos:

 const Greetings = ({ firstName, lastName }) => <div>Hey you! {firstName} {lastName}!</div>; 

Como você pode ver, aqui a construção (props) foi substituída por ({ firstName, lastName }) . Com essa substituição, informamos ao sistema que estamos interessados ​​apenas em duas propriedades do objeto props . E isso, por sua vez, permite acessar diretamente os valores de firstName e lastName sem especificar explicitamente propriedades de objetos como props.firstName .

E se, para resolver o mesmo problema, em vez de componentes funcionais, usarmos componentes baseados em classe? Nesse caso, o código do componente Greetings ficaria assim:

 class Greetings extends React.Component { render() {   return (     <div>Hey you! {this.props.firstName} {this.props.lastName}!</div>   ); } } 

Não sei quais sensações esse código causa, mas parece-me sobrecarregado com mecanismos auxiliares. Aqui, em particular, para acessar propriedades, você deve usar construções no formato this.props .

Principle princípio de responsabilidade exclusiva


O Princípio de Responsabilidade Única (SRP) é um dos princípios de programação mais importantes a serem seguidos. Ele nos diz que o módulo deve resolver apenas um problema e deve fazê-lo de maneira com qualidade. Se você desenvolver um projeto sem seguir somente esse princípio, o código para esse projeto poderá se transformar em um design de pesadelo que não pode ser suportado.

Como o princípio da responsabilidade exclusiva pode ser violado? Na maioria das vezes, isso acontece quando mecanismos não relacionados entre si são colocados nos mesmos arquivos. Neste material, frequentemente nos referiremos a esse princípio.

Iniciantes geralmente colocam muitos componentes em um arquivo. Por exemplo, temos o código para os componentes Greetings e App no mesmo arquivo. Na prática, isso não deve ser feito, pois isso viola o SRP.

Mesmo componentes muito pequenos (como o nosso componente Greetings ) precisam ser colocados em arquivos separados.

Coloque o código do componente Greetings em um arquivo separado:

 import React from "react"; const Greetings = ({ firstName, lastName }) => (   <div>       Hey you! {firstName} {lastName}!   </div> ); export default Greetings; 

Em seguida, use este componente no componente App :

 import Greetings from "./Greetings"; const App = () => ( ... ); 

Observe que o nome do arquivo deve corresponder ao nome do componente. Ou seja, o código do componente App deve ser colocado no arquivo App.js , o código do componente Greetings no arquivo Greetings e assim por diante.

▍ Familiaridade com o estado do aplicativo


Estado é outro conceito central no React. É aqui que os dados do aplicativo são armazenados - ou seja, o que pode mudar. Precisa salvar algo digitado no campo de formulário? Use state. Precisa salvar pontos marcados por um jogador em um jogo de navegador? Para fazer isso, você deve usar o estado do aplicativo.

Vamos criar um formulário simples com o qual o usuário possa inserir seu nome. Observe que aqui eu uso intencionalmente uma classe para descrever o componente, pois isso facilita a demonstração do conceito em questão. Você pode ler sobre como converter um componente criado usando uma classe em um componente funcional aqui .

 import React from "react"; class SimpleForm extends React.Component { render() {   return (     <div>       <input type="text" name="firstName" />       <Greetings firstName="John" />     </div>   ); } } const App = () => ( <div>   <SimpleForm /> </div> ); 

O usuário pode inserir algo no campo do formulário, e isso é bom. No entanto, se você ler atentamente esse código, poderá perceber que John é sempre usado como o nome de usuário na saída da página de boas-vindas. E se nem todos os nossos usuários forem chamados assim? Nesse caso, colocamo-nos em uma posição não muito confortável.

Como usar o valor digitado no campo? O React não depende diretamente dos elementos DOM. Manipuladores de eventos e estado do aplicativo nos ajudarão a resolver esse problema.

 class SimpleForm extends React.Component { state = {   firstName: "", }; onFirstNameChange = event =>   this.setState({     firstName: event.target.value   }); render() {   return (     <div>       <input type="text" name="firstName" onChange={this.onFirstNameChange} />       <Greetings firstName={this.state.firstName} />     </div>   ); } } 

Você pode imaginar um estado como um objeto JavaScript simples, que, na forma de uma propriedade, é armazenado na classe do componente SimpleForm . Neste objeto, adicionamos a propriedade firstName .

Aqui, equipamos o campo firstName com um manipulador de eventos. Inicia toda vez que um usuário insere pelo menos um caractere em um campo. Na classe, a propriedade onChange é responsável pelo processamento do onFirstNameChange onChange , no qual o seguinte comando é executado:

 this.setState(...) 

É aqui que o estado do componente é atualizado. O status do componente não é atualizado diretamente. Isso é feito apenas usando o método setState . Para escrever um novo valor na propriedade firstName , simplesmente passamos para esse método um objeto contendo o que precisa ser gravado no estado:

 { firstName: event.target.value } 

Nesse caso, event.target.value é o que o usuário digitou no campo do formulário, ou seja, seu nome.

Observe que não declaramos onFirstNameChange como um método. É muito importante que essas coisas sejam declaradas na forma de propriedades de classe que contêm funções de seta, e não na forma de métodos. Se você declarar uma função semelhante como método, this será vinculado ao elemento do formulário que chama esse método, e não à classe, como seria de esperar. Esta pequena coisa é muitas vezes confusa para iniciantes. Esse é um dos motivos para recomendar o uso de componentes funcionais em vez de classes de componentes.

▍Verifique os dados inseridos no formulário


Implementamos um sistema simples para verificar os dados inseridos no formulário usando expressões regulares. Vamos decidir que um nome deve consistir em pelo menos três caracteres e pode conter apenas letras.

Adicione o manipulador de eventos onBlur ao componente, que é chamado quando o usuário sai do campo de entrada. Adicione outra propriedade ao estado do aplicativo - firstNameError . Se ocorreu um erro ao digitar o nome, exibiremos uma mensagem sobre isso no campo.

Vamos analisar esse código.

 class SimpleForm extends React.Component { state = {   firstName: "",   firstNameError: "", }; validateName = name => {   const regex = /[A-Za-z]{3,}/;   return !regex.test(name)     ? "The name must contain at least three letters. Numbers and special characters are not allowed."     : ""; }; onFirstNameBlur = () => {   const { firstName } = this.state;   const firstNameError = this.validateName( firstName );   return this.setState({ firstNameError }); }; onFirstNameChange = event =>   this.setState({     firstName: event.target.value   }); render() {   const { firstNameError, firstName } = this.state;   return (     <div>       <div>         <label>           First name:           <input             type="text"             name="firstName"             onChange={this.onFirstNameChange}             onBlur={this.onFirstNameBlur}           />           {firstNameError && <div>{firstNameError}</div>}         </label>       </div>       <Greetings         firstName={firstName}       />     </div>   ); } } 

Status do aplicativo


Desenvolvendo um sistema de verificação de entrada, nós, para iniciantes, adicionamos uma nova propriedade ao estado: firstNameError :

 state = {  ...  firstNameError: "", }; 

Função de validação de dados


A validação de dados é realizada na função de seta validateName . Valida o nome digitado com uma expressão regular:

 validateName = name => { const regex = /[A-Za-z]{3,}/; return !regex.test(name)    ? "The name must contain at least three letters..."    : ""; } 

Se a verificação falhar, retornamos uma mensagem de erro da função. Se o nome passou no teste, retornamos uma string vazia que indica que nenhum erro foi encontrado durante a verificação do nome. Aqui, por uma questão de brevidade, usamos o operador ternário JavaScript.

Manipulador de eventos OnBlur


onBlur olhada no onBlur eventos onBlur , chamado quando o usuário sai do campo de entrada:

 onFirstNameBlur = () => { const { firstName } = this.state; const firstNameError = this.validateName( firstName ); return this.setState({ firstNameError }); }; 

Aqui, extraímos a propriedade firstName do estado, aproveitando a capacidade do ES6 de destruir objetos. A primeira linha deste código é equivalente a isso:

 const firstName = this.state.firstName; 

Em seguida, chamamos a função de verificação de dados descrita acima, passando-a firstName e firstNameError propriedade de estado firstNameError que essa função retorna. Se a verificação falhar, uma mensagem de erro será enviada para esta propriedade. Se for bem-sucedido, uma linha vazia será gravada lá.

Método de renderização


Considere o método render() do componente:

 render() {  const { firstNameError, firstName} = this.state;  ... } 

.

 <input ... onBlur={this.onFirstNameBlur} /> 

onFirstNameBlur onBlur .

 {firstNameError && <div>{firstNameError}</div>} 

JavaScript. div , , , firstNameError true .


, , , . , :

 render() { const { firstNameError, firstName } = this.state; return (   <div       style={{         margin: 50,         padding: 10,         width: 300,         border: "1px solid black",         backgroundColor: "black",         color: "white"       }}     >     <div style={{marginBottom: 10}}>       <label>         First name:         <input           style={{backgroundColor: '#EFEFFF', marginLeft: 10}}           type="text"           name="firstName"           onChange={this.onFirstNameChange}           onBlur={this.onFirstNameBlur}         />         {firstNameError && <div style={{color: 'red', margin: 5}}>{firstNameError}</div>}       </label>     </div>     <Greetings       firstName={firstName}     />   </div> ); } 

React style .

, , , , , . , .




▍ №2:


, , React-. , , — render , , . ? , . , , .

? , . style , . . , style.js :

 // style.js: const style = {   form: {       margin: 50,       padding: 10,       width: 300,       border: "1px solid black",       backgroundColor: "black",       color: "white"   },   inputGroup: {       marginBottom: 10   },   input: {       backgroundColor: "#EFEFFF",       marginLeft: 10   },   error: {       color: "red",       margin: 5   } }; export default style; 

, , SimpleComponent :

 import style from './style'; class SimpleForm extends React.Component {   ...       render() {       const { firstNameError, firstName } = this.state;         return (         <div style={style.form}>           <div style={style.inputGroup}>             <label>               First name:               <input                 style={style.input}                 type="text"                 name="firstName"                 onChange={this.onFirstNameChange}                 onBlur={this.onFirstNameBlur}               />               {firstNameError && (                 <div style={style.error}>{firstNameError}</div>               )}             </label>           </div>             <Greetings firstName={firstName} />         </div>       );     } } export default SimpleForm; 

, . .


, :

 class SimpleForm extends React.Component { state = {   ...   lastName: "",   lastNameError: "" }; validateName = ...; onFirstNameBlur = ...; onFirstNameChange = ...; onLastNameBlur = () => {   const { lastName } = this.state;   const lastNameError = this.validateName(lastName);   return this.setState({ lastNameError }); }; onLastNameChange = event =>   this.setState({     lastName: event.target.value   }); render() {   const { firstNameError, firstName, lastName, lastNameError } = this.state;   return (     <div style={style.form}>       <div style={style.inputGroup}>         <label>           First name:           <input             style={style.input}             type="text"             name="firstName"             onChange={this.onFirstNameChange}             onBlur={this.onFirstNameBlur}           />           {firstNameError && <div style={style.error}>{firstNameError}</div>}         </label>       </div>       <div style={style.inputGroup}>         <label>           Last name:           <input             style={style.input}             type="text"             name="lastName"             onChange={this.onLastNameChange}             onBlur={this.onLastNameBlur}           />           {lastNameError && <div style={style.error}>{lastNameError}</div>}         </label>       </div>       <Greetings firstName={firstName} lastName={lastName} />     </div>   ); } } export default SimpleForm; 

— , firstName .

«»? — , .

▍ №3:


, , , , , . , , render . .

, , , . TextField , .

 import React from 'react' import style from "./style"; const TextField = ({name, onChange, onBlur, error, label}) => ( <div style={style.inputGroup}>   <label>     {label}     <input       style={style.input}       type="text"       name={name}       onChange={onChange}       onBlur={onBlur}     />     {error && <div style={style.error}>{error}</div>}   </label> </div> ); export default TextField; 

, , render . , , .

SimpleForm :

 ... import TextField from './TextField'; class SimpleForm extends React.Component { ... render() {   const { firstNameError, firstName, lastName, lastNameError } = this.state;   return (     <div style={style.form}>       <TextField name="firstName"                  label="First name:"                  onChange={this.onFirstNameChange}                  onBlur={this.onFirstNameBlur}                  error={firstNameError} />       <TextField name="lastName"                  label="Last name:"                  onChange={this.onLastNameChange}                  onBlur={this.onLastNameBlur}                  error={lastNameError} />       <Greetings firstName={firstName} lastName={lastName} />     </div>   ); } } 

, . , TextField . FirstNameField :

 import React from 'react'; import TextField from './TextField'; const FirstNameField = ({...rest}) => ( <TextField name="firstName"             label="First name:"             {...rest} /> ); export default FirstNameField; 

, . ({...rest}) ( rest, ). , , , rest . , , TextField , « », spread (, {...rest} , ). rest , , TextField .

, : , FirstNameField TextField .

LastNameField :
:

 ... import FirstNameField from './FirstNameField'; import LastNameField from './LastNameField'; class SimpleForm extends React.Component { ... render() {   const { firstNameError, firstName, lastName, lastNameError } = this.state;   return (     <div style={style.form}>       <FirstNameField onChange={this.onFirstNameChange}                       onBlur={this.onFirstNameBlur}                       error={firstNameError} />       <LastNameField onChange={this.onLastNameChange}                       onBlur={this.onLastNameBlur}                       error={lastNameError} />       <Greetings firstName={firstName} lastName={lastName} />     </div>   ); } } 

.


, , , :

  • , , , .
  • . , , , , 1000 ( ).
  • , . , , .
  • , , , . . , , . , , , .
  • , , , , .
  • this , .

Sumário


, React- . , , , , . , , , React, , , , UI-.

→ , ,

Caros leitores! , , React-, .

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


All Articles