Coloca cada porción de estado en el ancestro común más cercano para compartir datos entre varios componentes sin duplicarlos.
Abrir esta lección en KodokonDos componentes hermanos necesitan mostrar los mismos datos: un campo de búsqueda y la lista que filtra, por ejemplo. Un estado local en cada uno no puede funcionar, porque no pueden verse entre sí. La solución es elevar el estado hasta su ancestro común más cercano: el padre posee los datos y los devuelve hacia abajo a través de props.
import { useState } from "react";
function ProductPage({ products }) {
const [query, setQuery] = useState("");
return (
<>
<SearchBar query={query} onChange={setQuery} />
<ProductList products={products} query={query} />
</>
);
}Los hijos se convierten entonces en componentes controlados: reciben el valor de solo lectura y, para cambiarlo, llaman a la función de callback proporcionada por el padre. Los datos fluyen hacia abajo a través de props, las solicitudes de cambio fluyen hacia arriba a través de funciones. Este flujo unidireccional hace que el comportamiento de la aplicación sea fácil de seguir.
function SearchBar({ query, onChange }) {
return (
<input
value={query}
onChange={(e) => onChange(e.target.value)}
placeholder="Search for a product"
/>
);
}
function ProductList({ products, query }) {
const visible = products.filter((p) =>
p.name.toLowerCase().includes(query.toLowerCase())
);
return (
<ul>
{visible.map((p) => <li key={p.id}>{p.name}</li>)}
</ul>
);
}Cada dato debe tener una única fuente de la verdad. Si dos componentes almacenan cada uno su propia copia del mismo estado, las copias acabarán divergiendo: una se actualiza, la otra no, y la interfaz se vuelve inconsistente. Elevar el estado elimina ese riesgo. Cuando los datos deben atravesar muchos niveles, la composición (próxima lección) y luego el contexto aligeran el paso de props.