📚
Lerndokumentationen
Web
Web
  • Willkommen
  • HTML
    • Was ist HTML?
    • Elemente
    • Attribute
    • Boilerplate
  • Textelemente
  • Links
  • Dokumentenstruktur
  • Medien
  • Tabellen
  • Formulare
  • CSS
    • Was ist CSS?
    • Syntax
  • Einheiten
  • Selektoren
  • Boxmodell
  • Hintergründe und Rahmen
  • Overflow
  • Bilder
  • Formulare
  • Textelemente
  • Layout
    • Flexbox
    • Grid
  • Responsive Design
  • JavaScript
    • Was ist JavaScript?
    • Einbindung in HTML
    • Grundlagen
      • Variablen und Werte
      • Datentypen
      • Operatoren und Ausdrücke
      • Kontrollstrukturen
      • Schleifen
    • Funktionen
      • Funktionsdeklarationen vs. Funktionsausdrücke
      • Arrow Functions
      • Standardparameter und Rest-Parameter
      • First-Class und Higher-Order-Funktionen
      • Closures
      • IIFE (Immediately Invoked Function Expressions)
    • Arrays
      • Erstellen und Modifizieren
      • Iteration über Arrays
      • Sortieren
      • Nützliche Methoden
    • Objekte und Datenstrukturen
      • Erstellen und Manipulieren
      • Destructuring
      • Sets und Maps
    • Strings
      • Template Literals
      • Methoden
    • Moderne JavaScript-Features
      • Optionale Verkettung
      • Nullish Coalescing Operator
      • Spread und Rest Operator
      • Kurzschlussausdrücke
    • Scope und Kontext
      • this Keyword
      • Call, Apply und Bind
      • Hoisting und Temporal Dead Zone (TDZ)
    • Objektorientierte Programmierung
      • Prototypes
      • Constructor Functions
      • ES6 Classes
      • Die create()-Methode
    • Asynchronous JavaScript
      • AJAX
      • Promises
    • Zahlen, Daten, Internationalisierung und Timer
      • Mathematische Operationen
      • Datum und Zeit
      • Internationalisierung
      • Timer
    • Modules
    • JavaScript im Browser (DOM und Events)
      • Das DOM
      • Elemente auswählen, erstellen und manipulieren
      • Styles, Attribute und Klassen
      • Events und Event Listener
      • Event Propagation
        • Event Delegation
      • DOM Traversing
    • JavaScript Engine und Performance
      • Execution Context und Call Stack
  • TypeScript
    • Was ist TypeScript?
  • Compiler und Runtimes
  • Konfiguration
  • Types
    • Primitive Typen und Typableitung
    • Arrays und Tupel
    • Objekte
    • Top- und Bottom-Types
    • Enums
    • Utility Types
      • Records
  • Typenkombination
    • Union Types
    • Discriminated Unions
    • Intersections
  • Funktionen
  • Klassen
    • Grundlagen
    • Feldinitialisierer
    • Schreibgeschützte Felder
    • Implementieren
    • Private und Geschützte Member
    • Getter und Setter
    • Statische Member
    • Abstrakte Klassen und Member
  • Modules
    • Importieren und Exportieren
    • Ambient Types
    • Namespaces
    • Globals
  • React
    • Was ist React?
    • JSX
    • Komponenten
      • Root-Komponente
      • Styling
      • Listen
      • Conditional Rendering
      • Fragments
    • Props
      • Destructuring
      • Children
    • Interaktivität
      • Event Handling
      • State
      • Formulare
    • State Management
      • State anheben
      • Derived State
    • Komposition und Reusability
      • Komponentenstrukturierung
      • Prop Drilling
      • Komposition
Bereitgestellt von GitBook
Auf dieser Seite
  1. React
  2. State Management

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 Panels.

  • Accordion

    • Panel

    • Panel

Jede Panel-Komponente hat eine isActive State-Variable, die bestimmt, ob der Inhalt sichtbar ist oder nicht.

Panel.jsx
const Panel = ({ title, children }) => {
  const [isActive, setIsActive] = useState(false);
  
  return (
    <section className="panel">
      <h3>{title}</h3>
      {isActive ? (
        <p>{children}</p>
      ) : (
        <button onClick={() => setIsActive(true)}>
          Show
        </button>
      )}
    </section>
  );
}

export default Panel;
Accordion.jsx
const Accordion = () => {
  return (
    <>
      <h2>Almaty, Kazakhstan</h2>
      <Panel title="About">
        With a population of about 2 million, Almaty is Kazakhstan's largest city. From 1929 to 1997, it was its capital city.
      </Panel>
      <Panel title="Etymology">
        The name comes from <span lang="kk-KZ">алма</span>, the Kazakh word for "apple" and is often translated as "full of apples". In fact, the region surrounding Almaty is thought to be the ancestral home of the apple, and the wild <i lang="la">Malus sieversii</i> is considered a likely candidate for the ancestor of the modern domestic apple.
      </Panel>
    </>
  );
}

export default Accordion;

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.

1

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:

const [isActive, setIsActive] = useState(false);

Stattdessen füge isActive zu den Props der Panel-Komponente hinzu:

const Panel = ({ title, children, isActive }) => {...}

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.

2

Ü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 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:

const Accordion = () => {
  return (
    <>
      <h2>Almaty, Kazakhstan</h2>
      <Panel title="About" isActive={true}>
        With a population of about 2 million, Almaty is Kazakhstan's largest city. From 1929 to 1997, it was its capital city.
      </Panel>
      <Panel title="Etymology" isActive={true}>
        The name comes from <span lang="kk-KZ">алма</span>, the Kazakh word for "apple" and is often translated as "full of apples". In fact, the region surrounding Almaty is thought to be the ancestral home of the apple, and the wild <i lang="la">Malus sieversii</i> is considered a likely candidate for the ancestor of the modern domestic apple.
      </Panel>
    </>
  );
}
3

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:

const [activeIndex, setActiveIndex] = useState(0);

Wenn activeIndex den Wert 0 hat, ist das erste Panel aktiv, und wenn der Wert 1 ist, ist das zweite Panel aktiv.

Accordion.jsx
<>
  <Panel
    isActive={activeIndex === 0}
    onShow={() => setActiveIndex(0)}
  >
    ...
  </Panel>
  <Panel
    isActive={activeIndex === 1}
    onShow={() => setActiveIndex(1)}
  >
    ...
  </Panel>
</>

Der Button innerhalb des Panels wird nun das onShow-Prop als seinen Event-Handler nutzen:

Panel.jsx
<section className="panel">
  <h3>{title}</h3>
    {isActive ? (
      <p>{children}</p>
    ) : (
    <button onClick={onShow}>
      Show
    </button>
  )}
</section>

VorherigeState ManagementNächsteDerived State

Zuletzt aktualisiert vor 5 Monaten

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 weitergibt:

Event-Handler als Prop