Funktionierende React-Hook-Form-Beispiele, die du direkt auf der Seite ausprobieren kannst: Zod-Validierung, asynchrone Prüfungen, Field Arrays, ein mehrstufiger Wizard, Datei-Upload, Controller und Next.js Server Actions.
React Hook Form verwaltet React-Formulare mit unkontrollierten Eingaben: Rufe useForm auf, verteile register("name") auf jedes Eingabefeld und umschließe deine Submit-Funktion mit handleSubmit. Füge zodResolver hinzu, um mit einem Zod-Schema zu validieren. Die Formulare unten laufen direkt auf dieser Seite: Regeln, Zod, asynchrone Prüfungen, Field Arrays, ein Wizard, Datei-Upload und Server Actions.
Installation
Fülle jede Demo aus, sende sie mit Fehlern ab und korrigiere sie dann. Der Code daneben ist genau das, was läuft. Fehler sind per aria-describedby mit ihren Eingabefeldern verknüpft und werden mit role="alert" angesagt, sodass die Formulare auch mit einem Screenreader funktionieren.
React Hook Form rendert seltener neu, weil Eingabefelder unkontrolliert bleiben und es Werte über Refs liest. Formik hält jeden Wert im React-State. Bei großen Formularen ist React Hook Form meist schneller und braucht weniger Code.
Installiere zod und @hookform/resolvers, definiere ein z.object-Schema und übergib resolver: zodResolver(schema) an useForm. Verwende z.infer<typeof schema> als Formulartyp; die Fehlermeldungen kommen aus dem Schema.
Rufe reset() in deinem Submit-Handler auf, nachdem das Speichern geklappt hat, oder übergib mit reset(values) neue Werte. reset lässt sich auch in einem Effect aufrufen, sobald isSubmitSuccessful true wird.
HTML-Eingabefelder liefern Text. Registriere mit valueAsNumber: true oder nutze z.coerce.number() in einem Zod-Schema, um eine echte Zahl zu erhalten.
Ja. shadcn/ui liefert eine Form-Komponente, die auf dem Controller von React Hook Form aufbaut. Unser Leitfaden zu shadcn-Formularen und -Tabellen zeigt das mit einem Live-Beispiel.
Die Teile der API, die du am häufigsten nutzt
register verbindet ein Eingabefeld über seinen Namen und nimmt Regeln im HTML-Stil entgegen. errors enthält nach einem gescheiterten Absenden eine Meldung pro Feld.
Ein einziges Schema liefert Validierungsregeln, Fehlermeldungen und den TypeScript-Typ. refine prüft zwei Felder gemeinsam, und path legt fest, welches Feld den Fehler bekommt.
Eine validate-Funktion darf ein Promise zurückgeben. Gib true zurück, wenn der Wert in Ordnung ist, oder einen String, der als Fehler angezeigt wird. Kombiniere sie mit dem Modus onBlur, damit sie nicht bei jedem Tastendruck läuft.
useFieldArray verwaltet eine Liste innerhalb des Formulars. Nutze field.id als key, niemals den Index, damit React jedes Eingabefeld der richtigen Zeile zuordnet.
Nutze ein Formular für alle Schritte und rufe trigger mit den Feldern des aktuellen Schritts auf, bevor es weitergeht. Werte aus früheren Schritten bleiben im Formular, daher enthält das letzte Absenden alles.
Ein Datei-Eingabefeld wird wie jedes andere registriert; sein Wert ist eine FileList. Prüfe Größe und Typ in validate und sende die Datei mit FormData.
Eingabefelder ohne Ref, etwa viele Datumsauswahlen und eigene Selects, werden über Controller angebunden. Er übergibt value und onChange an deine Komponente.
Validiere im Browser für schnelles Feedback und erneut auf dem Server, weil der Browser umgangen werden kann. Ein gemeinsames Zod-Schema hält beides synchron; setError zeigt serverseitige Probleme am richtigen Feld an.
Brauchst du stattdessen ein einfaches HTML-Formular? Sieh dir an,
Gesendet:
Bitte gib deinen Namen ein
Bitte gib deine E-Mail-Adresse ein
Diese E-Mail-Adresse sieht falsch aus
Wird gesendet...
Senden
Gib eine gültige E-Mail-Adresse ein
Mindestens 8 Zeichen
Die Passwörter stimmen nicht überein
Passwort
Passwort bestätigen
Konto erstellen
Diese Demo simuliert den Server mit einer kurzen Wartezeit. Vergeben: admin, studio, hello.
Benutzername
Wähle einen Benutzernamen
Dieser Benutzername ist vergeben
Wird geprüft...
Sichern
Logodesign
Name von Position {n}
Menge von Position {n}
Position
Entfernen
Position hinzufügen
Speichern
Pflichtfeld
Schritt {n} von {total}
Unternehmen
Teamgröße
Tarif
Auswählen
Starter
Team
Fülle die markierten Felder aus.
Zurück
Weiter
Abschließen
Logo (PNG oder JPG, bis 2 MB; es bleibt in deinem Browser)
Datei auswählen
Max. 2 MB
Nur PNG oder JPG
Hochladen
Mindestens 10
Budget:
Kostenlos starten · Keine Kreditkarte nötig