State anheben
Manchmal möchte man, dass sich der Zustand von zwei Komponenten immer gemeinsam ändert. Dafür entfernt man den State aus beiden Komponenten, verschiebt ihn in die nächstgelegene gemeinsame Elternkomponente und gibt ihn dann über Props an die Komponenten weiter. Dies wird State anheben genannt und ist eine der häufigsten Aufgaben beim Schreiben von React-Code.
Beispiel
In diesem Beispiel rendert eine Accordion
Komponente zwei separate Panel
s.
Accordion
Panel
Panel
Jede Panel
-Komponente hat eine isActive
State-Variable, die bestimmt, ob der Inhalt sichtbar ist oder nicht.
Wenn wir nun das eine Panel
einblenden, bleibt das andere Panel
ausgeblendet - sie sind unabhängig voneinander.
Was aber, wenn wir möchten, dass nur ein Panel
auf einmal geöffnet ist? Um das zu machen müssen wir den State in die Parent-Komponente anheben.
State-Variablen von den Child-Komponenten entfernen
Man gibt die Kontrolle über isActive
des Panels an eine übergeordnete Komponente ab. Das bedeutet, dass die übergeordnete Komponente stattdessen isActive
an Panel
als Prop weitergibt. Entferne diese Zeile aus der Panel
-Komponente:
Stattdessen füge isActive
zu den Props der Panel
-Komponente hinzu:
Nun hat die Parent-Komponente von Panel
Kontrolle über den Wert isActive
, indem es ihn als Prop übergibt. Umgekehrt hat nun die Panel
-Komponente keine Kontrolle mehr über den Wert von isActive
.
Übergabe von Hard-Coded Daten aus der gemeinsamen Eltern-Komponente
Um den State anzuheben, muss man die nächstgelegene gemeinsame Parent-Komponente der beiden untergeordneten Komponenten finden:
Accordion
(nächstgelegene gemeinsame Parent-Komponente)Panel
Panel
In diesem Beispiel ist es die Komponente Accordion
. Da sie sich über beiden Panel
s befindet und deren Props steuern kann, wird sie zur „Soure of Truth“ dafür, welches Panel
gerade aktiv ist. Lass die Accordion
-Komponente einen hard-coded Wert von isActive
(z. B. true
) an beide Panel
s weitergeben:
State-Variable zur gemeinsamen Eltern-Komponente hinzufügen
Wenn wir den State anheben verändert es oft die Art und Weise, wie der Zustand gespeichert wird.
In diesem Fall sollte immer nur ein Panel
gleichzeitig aktiv sein. Das bedeutet, dass die gemeinsame Elternkomponente, das Accordion
, verfolgen muss, welches Panel gerade aktiv ist. Anstatt einen booleschen Wert zu verwenden, könnte sie eine Zahl als Index des aktiven Panels für die Zustandsvariable nutzen:
Wenn activeIndex
den Wert 0
hat, ist das erste Panel
aktiv, und wenn der Wert 1
ist, ist das zweite Panel
aktiv.
Der Button
innerhalb des Panel
s wird nun das onShow
-Prop als seinen Event-Handler nutzen:
Zuletzt aktualisiert