E aí, programador! o/
Nessa aula você vai conhecer um dos conceitos mais importantes do React, o state. Esse recurso nos permite ter informações na tela que são renderizadas e atualizadas dinamicamente de acordo com a mudança dos nossos valores no JavaScript. Vamos passar para a prática e você irá entender exatamente do que se trata e para que utilizamos ele.
Assim como nas aulas anteriores, também iremos utilizar o projeto do exercício 3 aqui.
Imagine que queremos ter um texto dinâmico no botão de seguir para que ele mude de “Follow” para “Following” assim que clicarmos pela primeira vez. Poderíamos tentar começar fazendo o seguinte:
// ...
export default function Profile(props) {
let followButtonText = "Follow"
function handleClick(ev) {
alert("Você agora está seguindo!")
followButtonText = "Following"
console.log({ followButtonText })
}
return (
<div className={styles.container}>
<img className={styles.avatar} src={props.avatar} alt={props.name} />
<Title>
<span>{props.name}</span>
<button
className={styles.followButton}
onClick={handleClick}
>
{followButtonText}
</button>
</Title>
// ...
Repare que ao fazermos isso temos o valor da variável no botão e conseguimos até modificá-lo na memória, o que pode ser visto através do console.log, no entanto, o que está na tela continua sendo o texto inicial “Follow”. Isso acontece por conta da forma como o React monta os seus componentes. Alterações feitas na memória, de forma virtual, não refletem no DOM real. A menos que utilizemos o recurso do state.
O state, ou estado, é o recurso do React usado para refletir as nossas mudanças virtuais no DOM real. Quando criamos um state, o React nos dá acesso a duas coisas: uma variável imutável que contém o seu valor atual e uma função que serve para mudar o valor da variável.
Para usar o state só precisamos utilizar a função “useState”. Ela ainda aceita como parâmetro o valor inicial, caso queiramos defini-lo:
import { useState } from "react"
// ...
export default function Profile(props) {
const state = useState("Follow")
console.log(state)
function handleClick(ev) {
alert("Você agora está seguindo!")
}
return (
<div className={styles.container}>
<img className={styles.avatar} src={props.avatar} alt={props.name} />
<Title>
<span>{props.name}</span>
<button
className={styles.followButton}
onClick={handleClick}
>
{state[0]}
</button>
// ...
Repare que o state é uma tupla (array de tamanho fixo) de dois elementos, o valor e o modificador. O React trabalha dessa forma para que possamos renomear esses elementos através de desestruturação. Com isso, forma comum de utilizarmos o state é a seguinte:
Obs.: uma convenção importante para se atentar aqui é o prefixo “set” + o nome da variável para a função modificadora, você pode usar o nome que quiser, mas a comunidade React inteira segue essa convenção.
// ...
export default function Profile(props) {
const [followText, setFollowText] = useState("Follow")
function handleClick(ev) {
alert("Você agora está seguindo!")
}
return (
<div className={styles.container}>
<img className={styles.avatar} src={props.avatar} alt={props.name} />
<Title>
<span>{props.name}</span>
<button
className={styles.followButton}
onClick={handleClick}
>
{followText}
</button>
// ...
Temos o state definido, agora só precisamos alterá-lo através da função “setFollowText”:
// ...
const [followText, setFollowText] = useState("Follow")
function handleClick(ev) {
alert("Você agora está seguindo!")
setFollowText("Following")
}
return (
// ...
A função modificadora “setState” irá acionar os mecanismos internos do React para causar uma nova renderização do componente. Nessa nova renderização o valor da variável estará atualizado com o que informamos e o resultado é que as nossas mudanças virtuais refletem no DOM real. Tudo isso de uma forma bem simples e intuitiva.