Menu

React Formulare: Inputs, Checkboxen, Select, Validierung

Baue Formulare in React mit kontrollierten Inputs: Textfelder, textarea, select, Checkboxen und Radio-Buttons, ein State-Objekt für viele Felder, Absenden mit onSubmit, Validierungsfehler anzeigen und Form Actions in React 19.

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

Ein React-Formular hält den Wert jedes Felds im State: Das Input zeigt value={state} und aktualisiert ihn mit onChange. Wenn jemand absendet, ruft ein onSubmit-Handler e.preventDefault() auf, um das Neuladen der Seite zu stoppen, und nutzt dann die Werte, die schon im State stehen.

Tippe einen Namen und drück Enter oder klicke auf den Button. Lösch dann die Zeile e.preventDefault();: Die Vorschau zeigt die Felder, die der Browser bei einem nativen Absenden geschickt hätte, was eine echte Seite außerdem neu laden würde.

Ein Input, dessen Wert aus dem State kommt, heißt kontrolliertes Input. Die Alternative, den Wert dem DOM zu überlassen und ihn später zu lesen, wird unter kontrollierte vs. unkontrollierte Komponenten behandelt.

Text-Inputs und textarea

Jedes Textfeld funktioniert gleich: value aus dem State, onChange liest e.target.value. Eine <textarea> folgt demselben Muster. In HTML steht ihr Text zwischen den Tags, in React übergibst du ihn als value.

Weil du den Wert selbst setzt, kannst du ändern, was getippt wurde, bevor es erscheint: Das Titelfeld macht aus jedem Buchstaben einen Großbuchstaben. Der Zeichenzähler aktualisiert sich bei jedem Tastendruck, weil body State ist und jede Änderung erneut rendert.

Select

Ein <select> nimmt value am select-Element selbst an, nicht selected an einer Option. e.target.value ist der value der gewählten Option.

Für eine Mehrfachauswahl fügst du multiple hinzu und übergibst ein Array als value. Lies die Auswahl mit Array.from(e.target.selectedOptions, (o) => o.value).

Checkbox und Radio-Buttons

Eine Checkbox wird mit checked kontrolliert, nicht mit value, und ihr Handler liest e.target.checked, das true oder false ist. Radio-Buttons einer Gruppe teilen sich einen name; jeder ist angehakt, wenn der State seinem Wert entspricht.

e.target.value an einer Checkbox zu lesen ist ein häufiger Fehler: Bei einer Checkbox ohne value-Attribut gibt es den String "on" zurück, egal ob das Kästchen angehakt ist oder nicht.

Ein State-Objekt für viele Felder

Ein Formular mit zehn Feldern braucht keine zehn useState-Aufrufe und zehn Handler. Halte ein Objekt, gib jedem Input einen name, der zu einem Schlüssel passt, und schreibe einen Handler, der den Namen als berechneten Schlüssel nutzt: [e.target.name].

Der Handler prüft den Input-Typ, damit die Checkbox einen Boolean speichert und die anderen Text. Ein Feld fügst du hinzu, indem du dem Startobjekt einen Schlüssel und ein Input mit demselben name gibst; der Handler muss sich nicht ändern. Der Spread behält jedes andere Feld (siehe Arrays und Objekte aktualisieren).

Ein Formular absenden

Setze die Submit-Logik auf das onSubmit des Formulars, nicht auf das onClick des Buttons. onSubmit feuert auch, wenn jemand in einem Textfeld Enter drückt, was ein Klick-Handler verpassen würde. Ein <button> in einem Formular ist standardmäßig ein Submit-Button; gib anderen Buttons type="button", damit sie nicht absenden.

Öffne die Konsole, tippe ein Passwort und drück Enter: Das Formular loggt das ganze Objekt. Ein Klick auf „Clear“ loggt nichts, weil es type="button" ist. Entferne dieses Attribut, und Clear sendet ebenfalls ab.

Validierung und Fehler anzeigen

Einfache Validierung ist eine Funktion, die die Werte nimmt und ein Objekt mit Meldungen zurückgibt. Führe sie beim Absenden aus, speichere das Ergebnis im State und zeige jede Meldung unter ihrem Feld. Deaktiviere den Submit-Button, solange eine Anfrage läuft, damit ein Doppelklick das Formular nicht zweimal sendet.

Klicke bei leeren Feldern auf Save, um beide Meldungen zu sehen, und füll sie dann aus. saveProfile steht für eine echte Anfrage: Es wartet 800 Millisekunden und wird dann aufgelöst. Das Attribut noValidate schaltet die eigenen Validierungsblasen des Browsers ab, damit nur deine Meldungen erscheinen; entferne es und füge einem Input required hinzu, um zu vergleichen.

Fehler können auch beim Rendern berechnet statt gespeichert werden, zum Beispiel const emailError = form.email && !form.email.includes('@'), was die Meldung schon beim Tippen zeigt. Wähle den Zeitpunkt, der zum Formular passt: beim Absenden ist ruhiger, beim Tippen gibt schnelleres Feedback.

Form Actions in React 19

React 19 bringt einen weiteren Weg, ein Formular zu verarbeiten. Übergib der Prop action des Formulars eine Funktion. React verhindert für dich das Neuladen der Seite und ruft die Funktion mit einem FormData-Objekt auf, das jedes Feld mit einem name enthält. Die Felder brauchen gar keinen State: Sie sind unkontrolliert, und React leert sie, nachdem die Action fertig ist.

Tippe deinen eigenen Kommentar und poste ihn. Die Liste zeigt deinen Text, und das Input springt zurück auf Nice docs: Nachdem die Action aufgelöst ist, setzt React unkontrollierte Felder auf ihren defaultValue zurück. Die Action kann async sein, und während sie läuft, behandelt React das Update als Transition.

Um einen Pending-Zustand oder einen Fehler aus der Action anzuzeigen, umschließe sie mit useActionState, das das neueste Ergebnis, eine umhüllte Action für das Formular und ein Flag isPending zurückgibt. Ein Button tief im Formular kann den Pending-Zustand auch mit useFormStatus aus react-dom lesen:

import { useFormStatus } from 'react-dom';

function SubmitButton() {
    const { pending } = useFormStatus();
    return <button disabled={pending}>{pending ? 'Posting...' : 'Post'}</button>;
}

useFormStatus ist in den Editoren hier nicht geladen, deshalb erscheint es nur in diesem statischen Block. Es muss in einer Komponente aufgerufen werden, die innerhalb des <form> gerendert wird, nicht in der Komponente, die das Formular rendert.

Kontrollierter State mit onSubmit und Form Actions mit FormData funktionieren in React 19 beide. Kontrollierte Felder passen zu Formularen, die schon beim Tippen reagieren (Live-Validierung, ein Zeichenzähler, voneinander abhängige Felder). Actions passen zu Formularen, bei denen du die Werte erst beim Absenden brauchst.

Häufig gestellte Fragen

Wie bekomme ich in React den Wert eines Inputs?

Speichere ihn im State und aktualisiere ihn über onChange: <input value={name} onChange={e => setName(e.target.value)} />. Der aktuelle Text steht dann immer in name. Bei Checkboxen liest du e.target.checked statt e.target.value.

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

Ruf am Anfang des onSubmit-Handlers e.preventDefault() auf. Ohne das führt der Browser ein normales Absenden aus, das navigiert und die Seite neu lädt.

Wie verwalte ich in React viele Inputs mit einem State?

Halte ein Objekt im State, gib jedem Input einen name, der zu einem Schlüssel passt, und nutze einen Handler mit berechnetem Schlüssel: setForm({ ...form, [e.target.name]: e.target.value }).

Warum nutzt eine textarea in React value statt children?

In HTML steht der Text einer textarea zwischen ihren Tags, aber in React übergibst du ihn als value (oder defaultValue), genau wie bei einem Input. So funktioniert jedes Textfeld in einem React-Formular gleich.

Was sind Form Actions in React 19?

In React 19 kannst du eine Funktion an <form action={fn}> übergeben. React verhindert das Neuladen der Seite, ruft die Funktion mit den FormData des Formulars auf und setzt unkontrollierte Felder zurück, wenn sie fertig ist. useActionState ergänzt ein Pending-Flag und ein Ergebnis.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S