Elevar el estado
Un input de texto está al lado de una vista previa que necesita mostrar lo que se ha escrito. Ambos viven en el mismo árbol de componentes, pero el estado declarado dentro de un componente es invisible para sus vecinos, así que ni el input ni la vista previa pueden leer o cambiar lo que el otro tiene. La solución es mover ese estado al componente padre que comparten ambos, y luego pasar el valor a cada uno como prop. Esto se llama elevar el estado.
Acá está ese par, compartiendo un 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>Escribiste: {text}</p>
}Form es el padre común más cercano de TextInput y TextDisplay, así que ahí es donde vive text. Pasa text a ambos, y pasa setText a TextInput con el nombre onChange. Cuando alguien escribe, TextInput llama a onChange con el nuevo valor, el estado de Form se actualiza, y Form se re-renderiza. Ese re-render envía el nuevo text hacia abajo a ambos hijos, así que TextDisplay muestra exactamente lo que hay en el input sin mantener estado propio.
Mantén el estado tan bajo como sea posible
Elevar el estado es un movimiento que haces solo cuando lo necesitas. La regla de oro es colocación de estado: mantén cada parte del estado tan baja en el árbol como pueda vivir, cerca del componente que realmente la usa, y elévala solo cuando algo más también necesita leerla o cambiarla. Un componente con estado que nadie toca debe mantener ese estado para sí mismo.
Esto importa porque elevar tiene un costo. Cada nivel que una parte del estado sube, el padre tiene que pasarla de nuevo hacia abajo como prop, y cada componente en el medio tiene que aceptar y pasar adelante esa prop aunque nunca use el valor. Empieza local. Eleva el estado solo hasta el componente más cercano que realmente necesita compartirlo, y no más.
Pasar el setter hacia abajo
Nota que Form no solo pasa text hacia abajo. También pasa setText, como la prop onChange. Esta es la otra mitad de elevar el estado: el componente que es dueño del estado entrega una manera de cambiarlo mediante props, y el hijo llama a esa función en lugar de manejar el valor por sí mismo. TextInput nunca ve setText directamente. Llama a cualquier función que le dieron, y el padre decide qué hace realmente esa función.
Para estado compartido entre componentes anidados muchos niveles más abajo, pasar props hacia abajo a través de cada capa deja de ser práctico. React tiene herramientas para ese caso, Context entre ellas, y Context cubre useContext, el hook que lee un valor sin pasarlo a través de cada componente en el medio. Eso va más allá de lo que este capítulo cubre; el patrón de arriba es el que deberías usar primero.
El hijo nunca es dueño del valor; usa lo que le dan y le pide al padre que lo actualice.
Próximo: Effects, donde usarás useEffect para manejar trabajo que ocurre fuera del rendering.

