SkillGridInformatik durch Machen lernen

Zustand: Daten, die sich ändern, während die Seite offen ist

Warum der Bildschirm erst erfahren muss, dass sich etwas geaendert hat, der Unterschied zwischen Eigenschaften und Zustand, und warum eine Aktualisierung verschwindet, wenn man direkt in den Zustand schreibt.

14 Min. · 45 XP

Ein Like-Button ist eines der kleinsten Programme, die Menschen wirklich benutzen. Er speichert eine Zahl, zählt beim Klick eins dazu und zeigt das Ergebnis. Fast jede Schwierigkeit in der Frontend-Entwicklung versteckt sich in diesen drei Schritten.

Fang mit der naiven Version an, mit der, die jeder Anfänger zuerst schreibt.

let likes = 0;

function like() {
  likes = likes + 1;
}

like();
like();

React löst das, indem es den Wert und den Weg, ihn zu ändern, im selben Atemzug liefert. useState gibt ein Paar zurück: den Wert jetzt und einen Setter. Rufe den Setter auf, und die Komponente läuft erneut mit dem neuen Wert.

import { useState } from "react";

function LikeButton() {
  const [likes, setLikes] = useState(0);

  return (
    <button onClick={() => setLikes(likes + 1)}>
      {likes} likes
    </button>
  );
}Der Wert und der Weg, ihn zu ändern, zusammen zurückgegeben.

Die beiden Hälften dieser Zeile haben verschiedene Aufgaben. likes ist das, was dieser Durchlauf der Komponente sieht und zeichnet. setLikes ist der einzige ehrliche Weg, das zu ändern, was der nächste Durchlauf sehen wird. Ein Button, dessen Beschriftung sich nie ändert, ist fast immer ein Button, der die Variable ändert und den Setter nie aufruft.

Dasselbe Prinzip gilt beim Tippen. Ein Suchfeld, das verliert, was du getippt hast, ist das klassische Symptom für ein Feld, an das sich niemand erinnert.

function SearchBox() {
  const [text, setText] = useState("");

  return (
    <form>
      <input value={text} onChange={(e) => setText(e.target.value)} />
      <p>You typed: {text}</p>
    </form>
  );
}Das Feld zeigt, was im Zustand steht, und der Tastendruck schreibt den Zustand zurück.

Jetzt die Falle, in die alle tappen, meistens bei einer To-do-Liste. Arrays und Objekte sind keine Werte wie Zahlen: Sie sind Verweise auf einen Platz im Speicher. Wenn du den Inhalt änderst, bleibt der Verweis genau da, wo er war.

const [items, setItems] = useState(["Bread", "Tea"]);

function addBad(name) {
  items.push(name);
  setItems(items);
}

function addGood(name) {
  setItems([...items, name]);
}Eine dieser beiden Versionen lässt die Liste auf dem Bildschirm unverändert.

Es gibt also zwei Arten von Daten in einer Komponente, und eine Frage trennt sie: Wer darf sie ändern? Eigenschaften werden von außen gegeben und sind nur lesbar. Der Zustand gehört nach innen und ist veränderbar. Ein Zähler mit einstellbarer Schrittweite braucht beides.

function Counter({ step }) {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + step)}>
      {count}
    </button>
  );
}

const a = <Counter step={1} />;
const b = <Counter step={5} />;Die Schrittweite kommt von außen, der Zähler gehört nach innen.
UserLikeButtonScreenclicksetLikes(likes + 1)the function runs againnew elementsnobody reloaded the page

Praxis

  1. Eine Zaehler-Komponente entscheidet anhand eines Schritt-Werts, wie viel sie pro Klick addiert, und behaelt den laufenden Gesamtstand selbst. Welcher der beiden Werte ist der Zustand?

    Hinweise
    • Die Zahl auf dem Bildschirm kommt aus einem der beiden Werte, und nur einen davon darf diese Komponente selbst schreiben.
    • Eine Eigenschaft ist ein Wert, der von aussen hereingereicht wird. Wer sie innen aendert, schreibt seine eigene Eingabe um.
  2. Ordne jedem Wert zu, ob er als Eigenschaft hereinkommt oder als Zustand zur Komponente gehoert.

    Hinweise
    • Frag dich, wer jeden Wert schreiben darf: die Komponente selbst oder die Stelle, die die Komponente auf die Seite setzt.
    • Zwei davon gehoeren zur Komponente und aendern sich, solange sie lebt; die anderen zwei werden von aussen festgelegt.
  3. Ein Like-Button wird geklickt. Bringe die Reihenfolge dessen, was danach passiert.

    1. 1Die Beschriftung auf dem Button zeigt die neue Zahl
    2. 2Die Komponentenfunktion läuft erneut und liest den neuen Wert
    3. 3Der Setter wird mit der neuen Zahl aufgerufen
    4. 4Der Klick-Handler wird ausgefuehrt
    5. 5React merkt sich den neuen Wert für diese Komponente
    Hinweise
    • Es kann nichts gezeichnet werden, was noch nicht gesetzt wurde. Deshalb kommt der Aufruf des Setters vor dem neuen Bild.
    • Die Komponente läuft nach der Wertänderung erneut. Darum ist der Funktionskörper nicht der erste Schritt des nächsten Durchlaufs.