Platziere jeden State-Teil im nächsten gemeinsamen Vorfahren, um Daten zwischen mehreren Komponenten zu teilen, ohne sie zu duplizieren.
Diese Lektion in Kodokon öffnenZwei Geschwisterkomponenten müssen dieselben Daten anzeigen: zum Beispiel ein Suchfeld und die Liste, die es filtert. Lokaler State in jeder von ihnen kann nicht funktionieren, weil sie sich gegenseitig nicht sehen. Die Lösung ist, den State hochzuziehen in ihren nächsten gemeinsamen Vorfahren: Die Elternkomponente besitzt die Daten und reicht sie über Props wieder nach unten.
import { useState } from "react";
function ProductPage({ products }) {
const [query, setQuery] = useState("");
return (
<>
<SearchBar query={query} onChange={setQuery} />
<ProductList products={products} query={query} />
</>
);
}Die Kinder werden dann zu kontrollierten Komponenten: Sie erhalten den Wert schreibgeschützt und rufen, um ihn zu ändern, die vom Elternteil bereitgestellte Callback-Funktion auf. Daten fließen über Props nach unten, Änderungsanfragen fließen über Funktionen nach oben. Dieser Einbahnfluss macht das Verhalten der Anwendung leicht nachvollziehbar.
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>
);
}Jeder Datenteil muss eine einzige Quelle der Wahrheit haben. Wenn zwei Komponenten jeweils ihre eigene Kopie desselben States speichern, driften die Kopien irgendwann auseinander: Eine wird aktualisiert, die andere nicht, und die Oberfläche wird inkonsistent. Den State hochzuziehen beseitigt dieses Risiko. Wenn die Daten viele Ebenen durchqueren müssen, erleichtern Komposition (nächste Lektion) und dann Context das Durchreichen der Props.