Menu

React Hooks: Jeder Hook mit Live-Beispielen erklärt

Ein Hook ist eine Funktion, deren Name mit use beginnt und mit der eine Komponente ein React-Feature wie State, Context, Refs oder Effekte nutzt. Sieh jeden eingebauten Hook nach Zweck gruppiert, die zwei Regeln, die jeder Hook befolgt, und wie du deinen eigenen schreibst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

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.

HookWas er dir gibtSeite
useStateEinen Wert, der Renders übersteht, und einen Setter, der erneut rendertuseState
useReducerState, der über eine Reducer-Funktion und dispatchte Actions aktualisiert wirduseReducer
useContextEinen von einem Elternteil bereitgestellten Wert, ohne Props zu übergebenuseContext
useRefEine veränderbare Box, die Renders übersteht, oft ein DOM-KnotenuseRef
useImperativeHandleWählt, was ein Elternteil über deine Ref siehtforwardRef
useEffectCode, der meist nach dem Zeichnen läuft: Timer, Abonnements, Daten ladenuseEffect
useLayoutEffectCode, der nach dem DOM-Update, aber vor dem Zeichnen läuftuseLayoutEffect
useInsertionEffectLäuft vor Layout-Effekten, für CSS-in-JS-Bibliotheken
useEffectEventEine Funktion, die ein Effekt aufrufen kann und die immer die neuesten Props und den neuesten State siehtuseEffect
useMemoCacht einen berechneten Wert zwischen RendersuseMemo
useCallbackCacht eine Funktion zwischen RendersuseCallback
useTransitionMarkiert ein Update als nicht dringend und sagt dir, solange es ausstehtuseTransition
useDeferredValueEine Kopie eines Werts, die bei schweren Renders hinterherhinktuseDeferredValue
useIdEine eindeutige ID, die auf Server und Client übereinstimmtuseId
useSyncExternalStoreAbonniert einen Store, der außerhalb von React lebtuseSyncExternalStore
useDebugValueEin Label für einen Custom Hook in den React DevTools
useLiest ein Promise oder einen Context und darf in einer Bedingung stehenuse
useActionStateState, den eine Form Action aktualisiert, mit einem Pending-FlaguseActionState
useOptimisticZeigt das erwartete Ergebnis, bevor der Server antwortetuseOptimistic
useFormStatusDen 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:

  1. Ruf Hooks auf der obersten Ebene deiner Komponente auf, nie in einer Bedingung, einer Schleife oder einer verschachtelten Funktion.
  2. 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, oder useReducer, 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: useMemo und useCallback. 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: useTransition oder useDeferredValue.

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.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S