React Hooks sind Funktionen, deren Namen mit use beginnen und mit denen eine Funktionskomponente React-Features nutzt: useState, um sich einen Wert zu merken, useEffect, um nach dem Rendern Code auszuführen, useRef, um einen DOM-Knoten festzuhalten, useContext, um geteilte Daten zu lesen. Du rufst sie oben in deiner Komponente auf, und React behält ihre Werte zwischen Renders.
Hier arbeiten vier Hooks zusammen. useState speichert den Text, useRef zeigt auf das Input, damit der Button es fokussieren kann, useMemo behält die gefilterte Liste, bis sich die Suche ändert, und useEffect loggt nach jedem Render, in dem sich die Suche geändert hat. Tippe an und beobachte die Konsole: eine Zeile pro Tastendruck, nachdem sich die Liste aktualisiert hat.
Warum es Hooks gibt
Vor React 16.8 musste eine Komponente, die State oder Lifecycle-Code brauchte, eine Klasse sein. Die Logik für ein Feature war auf componentDidMount, componentDidUpdate und componentWillUnmount verteilt, und sie zwischen Komponenten zu teilen hieß Mixins (die mit der Klassensyntax nie funktionierten), Higher Order Components oder Render Props, die alle deinen Baum in zusätzliche Schichten hüllten.
// The class way: one feature, three methods
class Clock extends React.Component {
state = { now: new Date() };
componentDidMount() {
this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
}
componentWillUnmount() {
clearInterval(this.id);
}
render() {
return <p>{this.state.now.toLocaleTimeString()}</p>;
}
}
Mit Hooks lebt dasselbe Feature an einem Ort: Der Effekt startet den Timer, und sein Cleanup stoppt ihn.
Versteck die Uhr, und die Konsole gibt timer stopped aus: React hat das Cleanup ausgeführt, als Clock den Bildschirm verließ. Zeig sie wieder, und ein frischer Timer startet. Klassenkomponenten funktionieren in React 19 weiterhin, aber neuer Code nutzt Hooks.
Jeder eingebaute Hook
React 19.2 gruppiert seine Hooks danach, was sie einer Komponente geben. Die ersten beiden Gruppen nutzt du jeden Tag, den Rest, wenn ein bestimmtes Problem danach verlangt.
| Hook | Was er dir gibt | Seite |
|---|---|---|
useState | Einen Wert, der Renders übersteht, und einen Setter, der erneut rendert | useState |
useReducer | State, der über eine Reducer-Funktion und dispatchte Actions aktualisiert wird | useReducer |
useContext | Einen von einem Elternteil bereitgestellten Wert, ohne Props zu übergeben | useContext |
useRef | Eine veränderbare Box, die Renders übersteht, oft ein DOM-Knoten | useRef |
useImperativeHandle | Wählt, was ein Elternteil über deine Ref sieht | forwardRef |
useEffect | Code, der meist nach dem Zeichnen läuft: Timer, Abonnements, Daten laden | useEffect |
useLayoutEffect | Code, der nach dem DOM-Update, aber vor dem Zeichnen läuft | useLayoutEffect |
useInsertionEffect | Läuft vor Layout-Effekten, für CSS-in-JS-Bibliotheken | |
useEffectEvent | Eine Funktion, die ein Effekt aufrufen kann und die immer die neuesten Props und den neuesten State sieht | useEffect |
useMemo | Cacht einen berechneten Wert zwischen Renders | useMemo |
useCallback | Cacht eine Funktion zwischen Renders | useCallback |
useTransition | Markiert ein Update als nicht dringend und sagt dir, solange es aussteht | useTransition |
useDeferredValue | Eine Kopie eines Werts, die bei schweren Renders hinterherhinkt | useDeferredValue |
useId | Eine eindeutige ID, die auf Server und Client übereinstimmt | useId |
useSyncExternalStore | Abonniert einen Store, der außerhalb von React lebt | useSyncExternalStore |
useDebugValue | Ein Label für einen Custom Hook in den React DevTools | |
use | Liest ein Promise oder einen Context und darf in einer Bedingung stehen | use |
useActionState | State, den eine Form Action aktualisiert, mit einem Pending-Flag | useActionState |
useOptimistic | Zeigt das erwartete Ergebnis, bevor der Server antwortet | useOptimistic |
useFormStatus | Den Pending-Zustand des umgebenden Formulars (aus react-dom) |
use, useActionState, useOptimistic und useFormStatus kamen mit React 19, und useEffectEvent wurde in 19.2 stabil. Jeder andere Hook der Liste funktioniert auch in React 18.
State rendert, Refs nicht
Nicht jeder Hook löst einen Render aus. useState und useReducer tun es: Ändere ihren Wert, und React zeichnet die Komponente neu. useRef gibt dir ein Objekt, dessen Feld current du frei ändern kannst, und React rendert deswegen nie neu. Das macht es zum richtigen Ort für eine Timer-ID, einen vorherigen Wert oder einen Zähler, den der Bildschirm nicht zeigt.
useReducer hält den Warenkorb und useState die Notiz; beide lösen einen Render aus, wenn sie sich ändern, und der Effekt loggt eine Zeile pro Render. Der Effekt ändert auch commits.current, doch diese Änderung löst nie einen eigenen Render aus, also gerät das Log nicht in eine Schleife. Der Zähler wird in einem Effekt aktualisiert statt im Komponentenkörper, weil der Körper beim Rendern nichts ändern sollte.
Die Regeln der Hooks
Jeder Hook befolgt zwei Regeln:
- Ruf Hooks auf der obersten Ebene deiner Komponente auf, nie in einer Bedingung, einer Schleife oder einer verschachtelten Funktion.
- Ruf Hooks nur aus Funktionskomponenten oder aus deinen eigenen Custom Hooks auf.
React kennt Hooks nicht beim Namen. Es kennt sie an der Reihenfolge, in der du sie aufrufst, und erwartet, dass diese Reihenfolge bei jedem Render gleich ist. Ein Hook in einem if würde jeden Hook danach verschieben. Die Seite zu den Regeln der Hooks zeigt, was kaputtgeht und wie du es behebst. use ist die einzige Ausnahme: Es darf in einer Bedingung aufgerufen werden.
Dein erster Custom Hook
Wenn zwei Komponenten dieselbe zustandsbehaftete Logik brauchen, verschiebe sie in eine Funktion, deren Name mit use beginnt. Diese Funktion kann jeden anderen Hook aufrufen. Jede Komponente, die sie aufruft, bekommt ihren eigenen State.
Beide Zähler führen denselben Hook aus, aber ein Klick auf den einen lässt den anderen in Ruhe: Ein Custom Hook teilt Logik, keinen State. Füge useCounter eine Funktion decrement und einen Button hinzu, der sie aufruft, und beide Zähler bekommen sie auf einmal. Weitere Muster (useToggle, useDebounce, useLocalStorage) stehen auf der Seite zu Custom Hooks.
Zu welchem Hook du greifst
- Der Bildschirm soll sich ändern, wenn sich ein Wert ändert:
useState, oderuseReducer, wenn viele Events denselben State aktualisieren. - Du musst mit etwas außerhalb von React sprechen (einem Timer, einem Abonnement, einer Anfrage):
useEffect. - Du brauchst einen DOM-Knoten oder einen Wert, den der Bildschirm nicht zeigt:
useRef. - Viele Komponenten tief im Baum brauchen denselben Wert:
useContext. - Ein Render ist langsam wegen einer Berechnung oder weil ein memoisiertes Kind neu rendert:
useMemounduseCallback. Der React Compiler kann diese Memoisierung für dich hinzufügen, aber sie von Hand zu schreiben funktioniert weiterhin und ist weiterhin üblich. - Das Tippen fühlt sich träge an, weil das Update dahinter schwer ist:
useTransitionoderuseDeferredValue.
Häufig gestellte Fragen
Was sind Hooks in React?
Hooks sind Funktionen, deren Namen mit use beginnen und mit denen eine Funktionskomponente React-Features nutzt: useState für State, useEffect für Nebeneffekte, useContext für Context, useRef für Werte, die Renders überstehen, ohne einen auszulösen, und mehr.
Warum wurden Hooks zu React hinzugefügt?
Vor Hooks (React 16.8) gab es State und Lifecycle-Methoden nur in Klassenkomponenten, und zustandsbehaftete Logik zu teilen brauchte Mixins, Higher Order Components oder Render Props. Hooks stecken diese Logik in einfache Funktionen, die du aus jeder Funktionskomponente aufrufen und als Custom Hooks teilen kannst.
Wie viele Hooks hat React?
React 19.2 liefert im Paket react etwa zwanzig eingebaute Hooks, dazu useFormStatus in react-dom. Die meisten Apps nutzen täglich eine Handvoll: useState, useEffect, useRef, useContext, useMemo und useCallback.
Kann ich Hooks in Klassenkomponenten nutzen?
Nein. Hooks funktionieren nur in Funktionskomponenten und in anderen Hooks. Du kannst eine Klassenkomponente trotzdem neben Funktionskomponenten rendern, und eine Klasse kann eine Funktionskomponente rendern, die Hooks nutzt.
Was ist ein Custom Hook?
Deine eigene Funktion, deren Name mit use beginnt und die andere Hooks aufruft. Damit können mehrere Komponenten dieselbe zustandsbehaftete Logik wiederverwenden, während jede aufrufende Komponente trotzdem ihren eigenen State bekommt.