Menu

React Events: onClick, onChange, onSubmit und mehr

React-Events sind Props wie onClick und onChange, die eine Funktion annehmen, die React mit einem Event-Objekt aufruft, wenn jemand etwas tut. Lerne, wie du einen Handler übergibst statt ihn aufzurufen, Argumente übergibst, e.target.value und e.key liest, das Neuladen von Formularen verhinderst und Bubbling stoppst.

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

React behandelt Events mit Props, die nach dem Event in camelCase benannt sind, etwa onClick, onChange und onSubmit. Du übergibst eine Funktion, und React ruft sie mit einem Event-Objekt auf, wenn jemand klickt, tippt oder absendet.

Jeder Klick führt handleClick aus, das den Zähler aktualisiert und in die Konsole unter der Vorschau loggt. Probiere onDoubleClick anstelle von onClick: Jetzt zählt nur ein Doppelklick.

Übergib die Funktion, ruf sie nicht auf

Die Prop nimmt eine Funktion an, und React ruft sie später auf. Ein sehr häufiger Fehler ist, Klammern hinzuzufügen. Dann wird die Funktion sofort aufgerufen, beim Rendern, und React bekommt stattdessen ihren Rückgabewert.

Die Konsole zeigt „Hi, during render“, bevor du irgendetwas anfasst: React hat sayHi beim Rendern des ersten Buttons ausgeführt, und weil sayHi undefined zurückgibt, hat dieser Button gar keinen Handler. Ein Klick auf Wrong bewirkt nichts. Ein Klick auf Right loggt „Hi, Ada“, weil die Arrow Function erst beim Klick läuft.

Die Arrow Function ist auch der Weg, Argumente zu übergeben. onClick={() => removeItem(item.id)} erzeugt für jeden Eintrag eine kleine Funktion, die deine mit der richtigen ID aufruft. Wenn ein Handler keine Argumente braucht, übergib ihn per Namen: onClick={handleClick}.

Bei einem State-Setter ist der Fehler schlimmer: onClick={setCount(count + 1)} setzt State beim Rendern, was erneut rendert, was erneut State setzt, und React stoppt mit „Too many re-renders“.

Das Event-Objekt

React übergibt jedem Handler ein Argument, das Event-Objekt. Es hat dieselben Eigenschaften wie das Event des Browsers: e.target ist das Element, an dem das Event passiert ist, e.key ist die gedrückte Taste, e.preventDefault() bricht die Standardaktion des Browsers ab. React umhüllt das native Event mit einem sogenannten Synthetic Event, damit es sich in jedem Browser gleich verhält; das Original liegt unter e.nativeEvent, falls du es je brauchst.

Die zwei, die du am meisten nutzt, sind e.target.value in onChange und e.key in onKeyDown.

Tippe hooks und drück Enter: Der Tag wird hinzugefügt und das Feld geleert. Die Konsole loggt jede Taste, auch Shift, Backspace und Enter, mit den Namen aus e.key. Drück Escape mitten in einem Wort, um es zu verwerfen.

onChange in React feuert bei jedem Tastendruck. In reinem HTML feuert das change-Event eines Textfelds erst, wenn es den Fokus verliert, das ist also ein bewusster Unterschied: So bleiben Eingabefeld und State Buchstabe für Buchstabe im Gleichschritt. Checkboxen geben dir e.target.checked statt value. Die Seite zu Formularen behandelt jeden Eingabetyp.

Formulare und preventDefault

Wenn ein Formular abgesendet wird, ist die Standardaktion des Browsers, es zu senden und eine neue Seite zu laden. In einer React-App willst du die Daten fast immer selbst verarbeiten, also beginnt der Submit-Handler mit e.preventDefault().

Setze onSubmit auf das <form>, nicht onClick auf den Button: Dann sendet auch Enter im Feld das Formular ab, und die eigenen Prüfungen des Browsers (hier required und type="email") laufen zuerst. Lösch die Zeile e.preventDefault() und sende erneut ab: Eine echte Seite würde jetzt zu einer neuen Seite wechseln und die Dankesnachricht verlieren. Die Vorschau blockiert das und zeigt stattdessen, was das Formular senden würde, email= ohne Wert, weil setEmail('') das Feld schon geleert hatte, als das Formular gelesen wurde.

In React 19 kannst du außerdem eine Funktion an <form action={fn}> übergeben, die die Formulardaten erhält und unkontrollierte Felder für dich zurücksetzt. Die Seite zu Formularen zeigt beide Stile.

Bubbling und stopPropagation

Die meisten Events steigen auf (Bubbling): Nachdem sie am angeklickten Element gelaufen sind, laufen sie an seinem Elternelement, dann an dessen Elternelement, bis ganz nach oben. React-Handler folgen derselben Reihenfolge. Deshalb zählt ein Klick auf einen Button in einer anklickbaren Karte auch als Klick auf die Karte.

Klicke auf Bubbles up, und die Konsole loggt den Button, dann das innere Panel, dann die äußere Karte. Klicke auf Stops here, und nur der Button loggt: e.stopPropagation() beendet den Aufstieg. Ein Klick auf den Text des inneren Panels selbst loggt das Panel und die Karte.

Nutze stopPropagation sparsam. Ein häufiger berechtigter Fall ist ein Löschen-Button in einer anklickbaren Listenzeile, wo ein Klick auf Löschen nicht auch die Zeile öffnen soll. Wenn ein Elternteil wissen muss, ob der Klick von einem Kind kam, prüfe e.target, statt das Event zu stoppen. Um einen Handler auf dem Weg nach unten auszuführen, bevor Kinder das Event sehen, bietet React Capture-Versionen wie onClickCapture.

preventDefault und stopPropagation sind verschiedene Werkzeuge. Das erste bricht ab, was der Browser tun würde (einem Link folgen, ein Formular absenden, eine Checkbox anhaken). Das zweite verhindert, dass andere Handler von dem Event erfahren. Das eine aufzurufen bewirkt nicht das andere.

Weitere häufige Events

Dasselbe Muster gilt für jedes Event, das React unterstützt. Einige, die du oft nutzen wirst:

  • onFocus und onBlur feuern, wenn ein Eingabefeld den Fokus bekommt und verliert, praktisch, um eine Validierung anzuzeigen, nachdem jemand ein Feld verlassen hat.
  • onMouseEnter und onMouseLeave feuern, wenn der Zeiger ein Element betritt und verlässt. Anders als die meisten Events steigen sie nicht auf, also feuert das onMouseEnter des Elternelements nicht erneut, wenn der Zeiger vom Elternelement in sein Kind wandert.
  • onPointerDown, onPointerMove und onPointerUp funktionieren gleichermaßen für Maus, Touch und Stift, was sie zur besseren Wahl fürs Ziehen macht.
  • onScroll feuert, während ein Element scrollt. In React steigt es nicht auf.

Jeder Handler erhält ein Event-Objekt mit den Eigenschaften, die für ihn sinnvoll sind: e.clientX für Pointer-Events, e.key für Tastatur-Events, e.target für alle.

Handler als Props übergeben

Komponenten können Handler von ihrem Elternteil wie jede andere Prop annehmen. Benenne sie nach dem, was passiert ist, onSomething, und die Funktion, die es behandelt, handleSomething. Das spiegelt die eingebauten Events und macht offensichtlich, welche Props Callbacks sind.

Stepper besitzt die Zahl nicht; er meldet Klicks, und das Elternteil entscheidet, was sie bedeuten. Ändere handleDecrement so, dass es bei 1 statt bei 0 stoppt, und der Stepper folgt, ohne dass du ihn bearbeitest. State im Elternteil zu halten und Handler nach unten zu reichen ist das Muster, das unter State nach oben verlagern beschrieben wird.

Eigene Handler-Props sind nur Namen. onIncrement an deiner eigenen Komponente bewirkt nichts, bis die Komponente es an das onClick eines echten Elements weitergibt, und du kannst ihm beliebige Argumente geben, zum Beispiel onSelect(item.id).

Häufig gestellte Fragen

Wie übergebe ich einem onClick-Handler einen Parameter?

Pack den Aufruf in eine Arrow Function: onClick={() => deleteItem(item.id)}. Die Arrow Function ist das, was React beim Klick aufruft, und sie ruft dann deine Funktion mit dem Argument auf.

Warum läuft mein onClick, wenn die Seite lädt?

Du hast die Funktion aufgerufen, statt sie zu übergeben. onClick={handleClick()} führt handleClick beim Rendern aus und übergibt seinen Rückgabewert. Schreib onClick={handleClick} oder onClick={() => handleClick(id)}.

Was ist der Unterschied zwischen onChange in React und in HTML?

In HTML feuert das change-Event eines Textfelds, wenn es den Fokus verliert. onChange in React feuert bei jedem Tastendruck, wie das native input-Event, damit der State dem Text beim Tippen folgen kann.

Wie verhindere ich in React, dass ein Formular die Seite neu lädt?

Ruf am Anfang des onSubmit-Handlers e.preventDefault() auf. Setze den Handler auf das <form>, nicht auf den Submit-Button, damit auch Enter in einem Feld das Formular absendet.

Was ist ein Synthetic Event in React?

Es ist das Event-Objekt, das React an deine Handler übergibt. Es umhüllt das native Event des Browsers mit denselben Eigenschaften und Methoden (target, key, preventDefault(), stopPropagation()) und verhält sich in allen Browsern gleich. Das Original ist als e.nativeEvent verfügbar.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S