Elevando estado e criando uma fonte de verdade
1 min de leitura
fonte
Se dois componentes precisam enxergar e alterar o mesmo dado, guardar uma cópia em cada um cria risco de divergência. A solução comum é mover o estado para o ancestral compartilhado mais próximo.
import { useState } from 'react';
function CelsiusInput({ value, onChange }) {
return (
<label>
Celsius
<input
type="number"
value={value}
onChange={(event) => onChange(event.target.value)}
/>
</label>
);
}
function TemperaturePreview({ celsius }) {
const fahrenheit = celsius === '' ? '' : Number(celsius) * 1.8 + 32;
return <p>Fahrenheit: {fahrenheit === '' ? '-' : fahrenheit.toFixed(1)}</p>;
}
export default function App() {
const [celsius, setCelsius] = useState('');
return (
<main>
<CelsiusInput value={celsius} onChange={setCelsius} />
<TemperaturePreview celsius={celsius} />
</main>
);
}
Agora App é a fonte de verdade. O input recebe valor e callback por props;
o preview recebe o mesmo valor e calcula sua apresentação.
Carregando diagrama...
- Fonte de verdade: evita múltiplas cópias do mesmo dado.
- Lifting state up: move o estado para o ancestral que coordena os filhos.
- Componente controlado: recebe valor e callback em vez de possuir aquele estado sozinho.
No próximo nó, vamos reduzir ainda mais o estado guardado calculando valores que podem ser derivados durante a renderização.
// Quiz
Quando dois componentes precisam compartilhar o mesmo valor editável, onde esse estado costuma ficar?
// recursos
// avaliação da trilha
—
ainda sem avaliações