Elevando o estado
Um campo de entrada de texto fica ao lado de uma prévia que precisa mostrar o que foi digitado. Ambos vivem na mesma árvore de componentes, mas o estado declarado dentro de um componente é invisível para seus vizinhos, então nem o input nem a prévia conseguem ler ou alterar o que o outro está guardando. A solução é mover esse estado para o componente pai mais próximo que ambos compartilham, e depois passar o valor para cada um como prop. Isso é chamado de elevação de estado.
Aqui está esse par, compartilhando um valor:
import { useState } from 'react'
function Form() {
const [text, setText] = useState('')
return (
<>
<TextInput text={text} onChange={setText} />
<TextDisplay text={text} />
</>
)
}
function TextInput({ text, onChange }) {
return <input value={text} onChange={e => onChange(e.target.value)} />
}
function TextDisplay({ text }) {
return <p>Você digitou: {text}</p>
}Form é o pai comum mais próximo de TextInput e TextDisplay, então é lá que text vive. Ele passa text para ambos, e passa setText para TextInput com o nome onChange. Quando alguém digita, TextInput chama onChange com o novo valor, o estado de Form é atualizado, e Form é renderizado novamente. Essa re-renderização envia o novo text de volta para ambos os filhos, então TextDisplay mostra exatamente o que está no input sem manter nenhum estado próprio.
Mantenha o estado o mais local possível
Elevar o estado é um movimento que você faz apenas quando precisa. A regra orientadora é a colocalização de estado: mantenha cada pedaço de estado o mais baixo na árvore que ele conseguir ficar, perto do componente que realmente o usa, e eleve-o apenas quando outra coisa também precisar ler ou alterar. Um componente com estado que ninguém mais toca deve manter esse estado consigo mesmo.
Isso importa porque elevar tem um custo. A cada nível que um pedaço de estado sobe, o pai precisa passá-lo de volta como prop, e todo componente no meio precisa aceitar e repassar essa prop mesmo que nunca use o valor. Comece local. Eleve o estado apenas até o componente mais próximo que realmente precisa compartilhá-lo, não além.
Passando o setter para baixo
Repare que Form não passa apenas text para baixo. Ele também passa setText, como a prop onChange. Essa é a outra metade da elevação de estado: o componente que possui o estado disponibiliza uma forma de alterá-lo via props, e o filho chama essa função em vez de gerenciar o valor ele mesmo. TextInput nunca vê setText diretamente. Ele chama qualquer função que lhe foi dada, e o pai decide o que essa função realmente faz.
Para estado compartilhado entre componentes aninhados em muitos níveis, passar props para baixo através de cada camada deixa de ser prático. React tem ferramentas para esse caso, Context entre elas, e o capítulo Hooks cobre useContext, o hook que lê um valor sem passá-lo através de cada componente no meio. Isso vai além do que este capítulo cobre; o padrão acima é aquele para usar primeiro.
A seguir: Effects, onde você usará useEffect para lidar com trabalho que acontece fora da renderização.

