Beispiel
In diesem Beispiel rendert eineAccordion Komponente zwei separate Panels.
AccordionPanelPanel
Panel-Komponente hat eine isActive State-Variable, die bestimmt, ob der Inhalt sichtbar ist oder nicht.
- Panel
- Accordion
Panel.jsx
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 Stattdessen füge Nun hat die Parent-Komponente von
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:isActive zu den Props der Panel-Komponente hinzu: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)PanelPanel
Accordion. Da sie sich über beiden Panels 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 Panels 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 Wenn Der
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:activeIndex den Wert 0 hat, ist das erste Panel aktiv, und wenn der Wert 1 ist, ist das zweite Panel aktiv.Ein Klick auf den “Show”-Button in einem der Panels muss den aktiven Index im Accordion ändern. Ein Panel kann den activeIndex-Zustand nicht direkt setzen, weil dieser innerhalb des Accordions definiert ist. Die Accordion-Komponente muss explizit dem Panel erlauben, ihren Zustand zu ändern, indem sie einen Event-Handler als Prop weitergibt:Accordion.jsx
Button innerhalb des Panels wird nun das onShow-Prop als seinen Event-Handler nutzen:Panel.jsx