State-Management
Wenn Ihre Anwendung wächst, ist es hilfreich, gezielter darüber nachzudenken, wie Ihr State organisiert ist und wie Daten zwischen Ihren Komponenten fließen. Redundanter oder doppelter State ist eine häufige Fehlerquelle. In diesem Kapitel lernen Sie, wie Sie Ihren State gut strukturieren, wie Sie Ihre State-Aktualisierungslogik wartbar halten und wie Sie State zwischen entfernten Komponenten teilen.
In diesem Kapitel
- Wie man UI-Änderungen als State-Änderungen betrachtet
- Wie man State gut strukturiert
- Wie man State „nach oben hebt“, um ihn zwischen Komponenten zu teilen
- Wie man steuert, ob der State erhalten bleibt oder zurückgesetzt wird
- Wie man komplexe State-Logik in einer Funktion konsolidiert
- Wie man Informationen ohne „Prop-Drilling“ weitergibt
- Wie man das State-Management skaliert, wenn Ihre App wächst
Auf Eingaben mit State reagieren
Mit React modifizieren Sie die UI nicht direkt aus dem Code heraus. Sie schreiben beispielsweise keine Befehle wie „Button deaktivieren“, „Button aktivieren“, „Erfolgsmeldung anzeigen“ usw. Stattdessen beschreiben Sie die UI, die Sie für die verschiedenen visuellen Zustände Ihrer Komponente sehen möchten („Anfangszustand“, „Eingabezustand“, „Erfolgszustand“), und lösen dann die State-Änderungen als Reaktion auf Benutzereingaben aus. Dies ähnelt der Denkweise von Designern über UI.
Hier ist ein Quiz-Formular, das mit React erstellt wurde. Beachten Sie, wie es die State-Variablestatusverwendet, um zu bestimmen, ob der Absende-Button aktiviert oder deaktiviert werden soll und ob stattdessen die Erfolgsmeldung angezeigt werden soll.
Bereit, dieses Thema zu lernen?
LiesReagieren auf Eingaben mit State, um zu lernen, wie du Interaktionen mit einer state-gesteuerten Denkweise angehst.
Die State-Struktur auswählen
Eine gut strukturierte State kann den Unterschied ausmachen zwischen einer Komponente, die angenehm zu ändern und zu debuggen ist, und einer, die eine ständige Fehlerquelle darstellt. Das wichtigste Prinzip ist, dass der State keine redundanten oder duplizierten Informationen enthalten sollte. Wenn unnötiger State vorhanden ist, vergisst man leicht, ihn zu aktualisieren, und führt Fehler ein!
Zum Beispiel hat dieses Formular eineredundantefullNameState-Variable:
Du kannst sie entfernen und den Code vereinfachen, indem dufullNamewährend des Renderns der Komponente berechnest:
Dies mag wie eine kleine Änderung erscheinen, aber viele Fehler in React-Apps werden auf diese Weise behoben.
Bereit, dieses Thema zu lernen?
LiesChoosing the State Structure, um zu lernen, wie du die State-Struktur entwirfst, um Fehler zu vermeiden.
State zwischen Komponenten teilen
Manchmal möchtest du, dass sich der State zweier Komponenten immer gemeinsam ändert. Um das zu erreichen, entfernst du den State aus beiden, verschiebst ihn zu ihrem nächsten gemeinsamen Eltern-Element und übergibst ihn dann über Props an sie. Dies wird als „State nach oben heben“ bezeichnet und ist eine der häufigsten Aufgaben beim Schreiben von React-Code.
In diesem Beispiel sollte jeweils nur ein Panel aktiv sein. Um dies zu erreichen, hält die Elternkomponente den State und legt die Props für ihre Kinder fest, anstatt den aktiven State in jedem einzelnen Panel zu behalten.
Bereit, dieses Thema zu lernen?
LiesSharing State Between Components, um zu lernen, wie du State nach oben hebst und Komponenten synchron hältst.
State erhalten und zurücksetzen
Wenn du eine Komponente neu rendern lässt, muss React entscheiden, welche Teile des Baums beibehalten (und aktualisiert) werden sollen und welche Teile verworfen oder von Grund auf neu erstellt werden sollen. In den meisten Fällen funktioniert das automatische Verhalten von React gut genug. Standardmäßig erhält React die Teile des Baums, die mit dem zuvor gerenderten Komponentenbaum „übereinstimmen“.
Manchmal ist dies jedoch nicht das, was du möchtest. In dieser Chat-App wird die Eingabe nicht zurückgesetzt, wenn du eine Nachricht eingibst und dann den Empfänger wechselst. Dies kann dazu führen, dass der Nutzer versehentlich eine Nachricht an die falsche Person sendet:
React ermöglicht es Ihnen, das Standardverhalten zu überschreiben underzwingenSie, dass eine Komponente ihren Zustand zurücksetzt, indem Sie ihr einen anderenkey übergeben, wie z.B. <Chat key={email} />. Dies teilt React mit, dass, wenn der Empfänger ein anderer ist, dies als eineandereChat-Komponente betrachtet werden sollte, die von Grund auf neu mit den neuen Daten (und UI-Elementen wie Eingabefeldern) erstellt werden muss. Das Wechseln zwischen den Empfängern setzt nun das Eingabefeld zurück – obwohl Sie dieselbe Komponente rendern.
Bereit, dieses Thema zu lernen?
LiesZustand erhalten und zurücksetzen, um die Lebensdauer des Zustands und seine Steuerung zu lernen.
Zustandslogik in einen Reducer auslagern
Komponenten mit vielen Zustandsaktualisierungen, die über viele Event-Handler verteilt sind, können überwältigend werden. Für diese Fälle kannst du die gesamte Zustandsaktualisierungslogik außerhalb deiner Komponente in einer einzigen Funktion konsolidieren, die "Reducer" genannt wird. Deine Event-Handler werden prägnant, da sie nur die Benutzer-"Aktionen" angeben. Am Ende der Datei legt die Reducer-Funktion fest, wie der Zustand als Reaktion auf jede Aktion aktualisiert werden soll!
Bereit, dieses Thema zu lernen?
LiesExtrahieren von Zustandslogik in einen Reducer, um zu erfahren, wie du Logik in der Reducer-Funktion konsolidieren kannst.
Daten tief mit Context übergeben
Normalerweise übergibst du Informationen von einer Elternkomponente an eine Kindkomponente über Props. Das Übergeben von Props kann jedoch umständlich werden, wenn du eine Prop durch viele Komponenten hindurchreichen musst oder wenn viele Komponenten dieselben Informationen benötigen. Context ermöglicht es der Elternkomponente, Informationen für jede Komponente im darunterliegenden Baum verfügbar zu machen – egal wie tief sie verschachtelt ist – ohne sie explizit über Props zu übergeben.
Hier bestimmt dieHeading-Komponente ihre Überschriftenebene, indem sie die nächstgelegeneSectionnach ihrer Ebene „fragt“. JedeSectionermittelt ihre eigene Ebene, indem sie die übergeordneteSectionfragt und eins dazu addiert. JedeSectionstellt Informationen für alle Komponenten unter ihr bereit, ohne Props zu übergeben – sie tut dies über Context.
Bereit, dieses Thema zu lernen?
LiesDaten tief mit Context übergeben, um mehr über die Verwendung von Context als Alternative zum Übergeben von Props zu erfahren.
Skalieren mit Reducer und Context
Reducer ermöglichen es dir, die Aktualisierungslogik des Zustands einer Komponente zu konsolidieren. Context ermöglicht es dir, Informationen tief an andere Komponenten weiterzugeben. Du kannst Reducer und Context kombinieren, um den Zustand eines komplexen Bildschirms zu verwalten.
Mit diesem Ansatz verwaltet eine Elternkomponente mit komplexem Zustand diesen mit einem Reducer. Andere Komponenten, die sich irgendwo tief im Baum befinden, können ihren Zustand über Context lesen. Sie können auch Aktionen auslösen, um diesen Zustand zu aktualisieren.
Bereit, dieses Thema zu lernen?
LiesSkalierung mit Reducer und Context, um zu erfahren, wie sich die Zustandsverwaltung in einer wachsenden App skaliert.
Was kommt als Nächstes?
Gehe weiter zuReagieren auf Eingaben mit State, um dieses Kapitel Seite für Seite zu lesen!
Oder, wenn du mit diesen Themen bereits vertraut bist, warum nicht überNotausgängelesen?
