Dein erster State
Am Ende der letzten Lektion hat sich die Seite nicht verändert: React wusste nicht, dass sich likes geändert hatte, und bei jedem Rendern würde die Variable wieder bei 0 anfangen. Das löst State, ein Wert, den React für die Komponente aufbewahrt. Du erzeugst ihn mit useState:
import { useState } from "react";
export default function App() {
const [likes, setLikes] = useState(0);
function likeGeben() {
setLikes(likes + 1);
}
return (
<main>
<h1>Eulenchor</h1>
<p>♥ {likes}</p>
<button onClick={likeGeben}>Like</button>
</main>
);
}Jetzt zählt jeder Klick 1 dazu, und die Seite zeigt es an. Zeile für Zeile:
useStateist eine Funktion von React. Importiere sie oben in der Datei in geschweiften Klammern, so wie du benannte Exporte importierst.useState(0)gibt der Komponente einen State, der bei 0 beginnt. Die Funktion gibt ein Array mit zwei Dingen zurück, das du in Konstanten zerlegst:likes, der aktuelle Wert, undsetLikes, die Funktion, die ihn ändert. Die Namen wählst du selbst. Üblich istetwasundsetEtwas.setLikes(likes + 1)teilt React den neuen Wert mit. React rendert die Komponente dann erneut: Es ruftApp()noch einmal auf, und diesmal gibtuseState(0)den Wert 1 zurück, denn der Startwert wird nur beim ersten Mal verwendet. Das JSX enthält jetzt ♥ 1, und React ändert den Absatz auf der Seite entsprechend.
Die Reihenfolge ist also immer gleich: ein Ereignis, ein Handler, der einen Setter aufruft, ein neues Rendern mit dem neuen Wert und eine Seite, die ihn zeigt. Die Seite änderst du nie selbst.
Funktionen von React, deren Name mit use beginnt, wie useState, heißen Hooks. Rufe sie ganz oben in der Komponente auf, vor allem anderen, und nie innerhalb eines if, einer Schleife oder eines Handlers. Im Lauf des Kurses lernst du weitere Hooks kennen.
Typische Fehler:
likes = likes + 1oderlikes++im Handler.likesist eine Konstante, deshalb meldet die KonsoleTypeError: Assignment to constant variable.Und selbst wenn sie keine wäre, würde React nichts merken. Nur der Setter ändert State.- Kein
importvonuseState. Die Seite bleibt leer, und die Konsole meldetReferenceError: useState is not defined.
So schreibst du es:
Anweisungen
- 1
Ersetze die Variable
likesdurch State, damit jeder Klick auf Like die Zahl auf der Seite um 1 erhöht. (Dasconsole.log()kannst du löschen.) - 2
Füge nach Like einen Button Zurücksetzen hinzu, der die Likes wieder auf 0 setzt.