Hoje, na tradução da próxima parte do curso de treinamento do React, chamamos a atenção para a segunda lição sobre renderização condicional e um workshop sobre esse tópico.

→
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 37. Renderização Condicional, Parte 2
→
OriginalNo tutorial de hoje sobre renderização condicional, falaremos sobre o uso do operador lógico
&&
(And). Experimentaremos um projeto padrão criado por create-
App.js
-app, no arquivo
App.js
, no qual está localizado o seguinte código:
import React, {Component} from "react" class App extends Component { constructor() { super() this.state = { unreadMessages: [ "Call your mom!", "New spam email available. All links are definitely safe to click." ] } } render() { return ( <div> <h2>You have {this.state.unreadMessages.length} unread messages!</h2> </div> ) } } export default App
Agora, o aplicativo aparece no navegador, como mostrado abaixo.
Página do aplicativo no navegadorVocê já deve ter usado o operador
&&
em construções como
true && false
(que fornece
false
). Para que a expressão
true
seja retornada como resultado do cálculo de uma expressão, ela deve se parecer com
true && true
. Ao processar essas expressões, o JavaScript determina se o lado esquerdo é verdadeiro e, nesse caso, simplesmente retorna o que está no lado direito. Se uma expressão do formulário
false && false
processada,
false
será retornado imediatamente, sem verificar o lado direito da expressão. Como resultado, o operador
&&
pode ser usado na renderização condicional. Com ele, você pode retornar algo que será exibido na tela ou não retornar nada.
Vamos analisar o código do aplicativo de treinamento.
O estado do componente
App
armazena uma matriz de
unreadMessages
caracteres não
unreadMessages
. Cada linha nesta matriz representa uma mensagem não lida. A página exibe o número de mensagens não lidas, determinadas com base no comprimento da matriz. Se essa matriz estiver vazia, ou seja, não haverá um único elemento nela, o aplicativo exibirá o que é mostrado abaixo na página.
O aplicativo informa que não há mensagens não lidasPara atingir esse efeito, basta trazer a matriz para este formato:
unreadMessages: []
.
Se não houver mensagens não lidas, é completamente possível não exibir nenhuma mensagem. Se usarmos o operador ternário sobre o qual falamos da
última vez para implementar esse comportamento do aplicativo, o método
render()
do componente
App
poderá ser reescrito da seguinte maneira:
render() { return ( <div> { this.state.unreadMessages.length > 0 ? <h2>You have {this.state.unreadMessages.length} unread messages!</h2> : null } </div> ) }
Agora, se a matriz
unreadMessages
vazia, nada será exibido na página. Mas o código apresentado aqui pode ser simplificado usando o operador
&&
. Aqui está como ficaria:
render() { return ( <div> { this.state.unreadMessages.length > 0 && <h2>You have {this.state.unreadMessages.length} unread messages!</h2> } </div> ) }
Se houver algo na matriz, o lado direito da expressão será exibido na página. Se a matriz estiver vazia, nada será exibido na página.
Isso não quer dizer que o uso do operador
&&
na renderização condicional seja absolutamente necessário, pois o mesmo efeito pode ser alcançado usando um operador ternário que retorna
null
se a condição testada for falsa. Mas a abordagem apresentada aqui simplifica o código e, além disso, é usado com bastante frequência, para que você possa encontrá-lo enquanto lê os programas de outras pessoas.
Lição 38. Oficina. Renderização condicional
→
Original▍Job
Aqui está o código do componente funcional do
App
, armazenado no arquivo
App.js
de um projeto padrão criado usando create-
App.js
-app.
import React from "react" function App() { return ( <div> Code goes here </div> ) } export default App
Você precisa fazer o seguinte:
- Converta o código do componente para equipá-lo com state.
- Certifique-se de que o estado do componente contenha informações sobre se o usuário "efetuou login" ou não (neste exercício, "efetuando login" no sistema e "efetuando logout" significa apenas alterar o valor correspondente armazenado no estado).
- Adicione à página que o componente forma um botão que permite ao usuário efetuar login e logout.
- Esta é uma tarefa adicional. Certifique-se de que, se o usuário não estiver logado, o botão exibirá
LOG IN
e, se estiver logado, LOG OUT
.
- Na página formada pelo componente,
Logged in
se o usuário estiver conectado e Logged out
se não estiver Logged out
.
Se agora você sente que é difícil começar a resolver esses problemas, dê uma olhada nas dicas e comece a trabalhar.
▍Dicas
Para concluir esta tarefa, você precisa lembrar muito do que falamos nas aulas anteriores. Para começar, um componente que pode ter estado deve ser um componente baseado em uma classe. Este componente deve ter um construtor. No estado do componente, você pode armazenar uma propriedade lógica, por exemplo, ela pode ser chamada
isLoggedIn
, cujo valor,
true
ou
false
, indica se o usuário está logado ou não. Para que o botão que precisa ser adicionado à página gerada pelo aplicativo possa executar suas funções, ele precisará de um
onClick
eventos
onClick
. Para exibir textos diferentes, com base na alteração do valor do estado, será necessário recorrer à tecnologia de renderização condicional.
▍Solução
Transformamos o componente funcional disponível no código no componente com base em uma classe. Precisamos disso por várias razões. Primeiro, precisamos trabalhar com o estado do aplicativo. Em segundo lugar, precisamos de um manipulador de eventos chamado quando um botão é clicado. Em princípio, você pode escrever uma função independente e usá-la para manipular eventos de botão, mas eu prefiro descrever manipuladores nas classes de componentes.
A seguir, como será o código de um componente funcional convertido em um componente baseado em classe. Aqui, no construtor do componente, descrevemos seu estado inicial, que contém a propriedade
isLoggedIn
definida como
false
.
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: false } } render() { return ( <div> Code goes here </div> ) } } export default App
O código acima é uma solução para a primeira e a segunda parte da tarefa. Agora, vamos trabalhar para adicionar um botão à página exibida pelo componente. Até o momento, esse botão exibirá a mesma inscrição, independentemente do que estiver armazenado no estado do aplicativo. Nós o equiparemos com um manipulador de eventos, colocando nele, para verificar a operacionalidade do nosso código, um simples comando para enviar uma mensagem para o console. Além disso, nós, no construtor do componente, vincularemos esse manipulador a
this
, o que é útil quando, no código desse manipulador, nos referimos a mecanismos projetados para trabalhar com o estado do componente. Agora o código se parece abaixo.
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: false } this.handleClick = this.handleClick.bind(this) } handleClick() { console.log("I'm working!") } render() { return ( <div> <button onClick={this.handleClick}>LOG IN</button> </div> ) } } export default App
Quando você clica no botão
LOG IN
,
I'm working!
.
Agora, lembre-se de que, quando um botão é
isLoggedIn
, a propriedade
isLoggedIn
armazenada no estado
isLoggedIn
de
true
para
false
e vice-versa. Para fazer isso, no manipulador de cliques do botão, você precisará chamar a função
this.setState()
, que pode ser usada de duas maneiras. Ou seja, pode ser fornecida, na forma de um objeto, uma nova idéia do que deve estar contido no estado. A segunda variante de seu uso fornece a transferência de uma função que pega o estado anterior do componente e forma um novo, retornando novamente o objeto. Nós faremos exatamente isso. Foi o que obtivemos nesta fase do trabalho.
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: false } this.handleClick = this.handleClick.bind(this) } handleClick() { this.setState(prevState => { return { isLoggedIn: !prevState.isLoggedIn } }) } render() { return ( <div> <button onClick={this.handleClick}>LOG IN</button> </div> ) } } export default App
Aqui poderíamos usar a construção if-else, mas apenas convertemos
true
para
false
e
false
para
true
usando o operador lógico
!
(NÃO).
Até o momento, não possuímos um mecanismo que, com base no que é armazenado no estado, nos permita influenciar a aparência do aplicativo. Portanto, agora resolveremos a tarefa adicional da tarefa número 3. Ou seja, mudaremos o rótulo do botão, dependendo do estado do componente. Para conseguir isso, você pode declarar uma variável no método
render()
cujo valor,
LOG IN
ou
LOG OUT
, depende do que está armazenado no estado. Esse valor pode ser usado como texto do botão. Aqui está como fica.
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: false } this.handleClick = this.handleClick.bind(this) } handleClick() { this.setState(prevState => { return { isLoggedIn: !prevState.isLoggedIn } }) } render() { let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN" return ( <div> <button onClick={this.handleClick}>{buttonText}</button> </div> ) } } export default App
Agora vamos pegar a quarta parte da tarefa. Exibiremos o texto na página, dependendo de o usuário estar conectado ou não. Por uma questão de fato, considerando tudo o que já está presente no código do componente, a solução desse problema é muito simples. Abaixo está o código finalizado para o arquivo
App.js
import React from "react" class App extends React.Component { constructor() { super() this.state = { isLoggedIn: false } this.handleClick = this.handleClick.bind(this) } handleClick() { this.setState(prevState => { return { isLoggedIn: !prevState.isLoggedIn } }) } render() { let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN" let displayText = this.state.isLoggedIn ? "Logged in" : "Logged out" return ( <div> <button onClick={this.handleClick}>{buttonText}</button> <h1>{displayText}</h1> </div> ) } } export default App
É assim que o aplicativo se parece no navegador.
Página do aplicativo no navegadorClicar no botão
LOG IN
mostrado na figura anterior altera o estado do aplicativo, após o qual
LOG OUT
é exibido no botão, e o texto é exibido na página informando ao usuário que está logado.
Sumário
Hoje continuamos falando sobre renderização condicional, examinamos o uso do operador
&&
e concluímos uma tarefa prática envolvendo muitos dos mecanismos que estudamos. Da próxima vez, você continuará trabalhando no aplicativo Todo e em um novo tópico.
Caros leitores! Você já lidou com a tarefa prática de hoje?