Esempi funzionanti di React Hook Form da provare direttamente nella pagina: validazione con Zod, controlli asincroni, field array, un wizard in più passaggi, upload di file, Controller e server action di Next.js.
React Hook Form gestisce i form React con input non controllati: chiama useForm, applica register("name") a ogni input con lo spread e avvolgi la tua funzione di invio in handleSubmit. Aggiungi zodResolver per validare con uno schema Zod. I form qui sotto funzionano in questa pagina: regole, Zod, controlli asincroni, field array, un wizard, upload di file e server action.
Installazione
Compila ogni demo, inviala con degli errori, poi correggili. Il codice accanto è quello che viene eseguito. Gli errori sono collegati ai rispettivi input con aria-describedby e annunciati con role="alert", quindi i form funzionano anche con uno screen reader.
React Hook Form esegue meno re-render perché gli input restano non controllati e legge i valori tramite ref. Formik tiene ogni valore nello state di React. Per i form grandi, React Hook Form è di solito più veloce e richiede meno codice.
Installa zod e @hookform/resolvers, definisci uno schema z.object e passa resolver: zodResolver(schema) a useForm. Usa z.infer<typeof schema> come tipo del form, e i messaggi di errore arrivano dallo schema.
Chiama reset() nel tuo handler di invio dopo che il salvataggio è riuscito, oppure passa nuovi valori con reset(values). reset può anche essere chiamato in un effect quando isSubmitSuccessful diventa true.
Gli input HTML restituiscono testo. Registra con valueAsNumber: true, oppure usa z.coerce.number() in uno schema Zod, per ottenere un vero numero.
Sì. shadcn/ui include un componente Form basato sul Controller di React Hook Form. La nostra guida a form e tabelle shadcn lo spiega passo per passo con un esempio dal vivo.
Le parti dell'API che userai di più
register collega un input tramite il nome e accetta regole in stile HTML. errors contiene un messaggio per campo dopo un invio fallito.
Un solo schema ti dà regole di validazione, messaggi di errore e il tipo TypeScript. refine controlla due campi insieme, e path indica quale campo riceve l'errore.
Una funzione validate può restituire una promise. Restituisci true quando il valore va bene, o una stringa da mostrare come errore. Abbinala alla modalità onBlur così non viene eseguita a ogni tasto.
useFieldArray gestisce un elenco dentro il form. Usa field.id come key, mai l'indice, così React mantiene ogni input collegato alla riga giusta.
Mantieni un solo form per tutti i passaggi e chiama trigger con i campi del passaggio attuale prima di andare avanti. I valori dei passaggi precedenti restano nel form, quindi l'invio finale ha tutto.
Un input file si registra come qualsiasi altro; il suo valore è una FileList. Controlla dimensione e tipo in validate e invia il file con FormData.
Gli input che non espongono un ref, come molti date picker e select personalizzate, si collegano tramite Controller. Passa value e onChange al tuo componente.
Valida nel browser per un feedback rapido e di nuovo sul server perché il browser può essere aggirato. Condividere un unico schema Zod mantiene allineate le due validazioni; setError mostra i problemi lato server sul campo giusto.
Ti serve invece un semplice form HTML? Leggi
Inviato:
Inserisci il tuo nome
Inserisci la tua email
Questa email non sembra corretta
Invio in corso...
Invia
Inserisci un'email valida
Almeno 8 caratteri
Le password non coincidono
Password
Conferma password
Crea account
Questa demo simula il server con una breve attesa. Già presi: admin, studio, hello.
Nome utente
Scegli un nome utente
Questo nome utente è già preso
Verifica in corso...
Prendilo
Design del logo
Nome dell'elemento {n}
Quantità dell'elemento {n}
Elemento
Rimuovi
Aggiungi elemento
Salva
Obbligatorio
Passaggio {n} di {total}
Azienda
Dimensione del team
Piano
Scegli
Starter
Team
Compila i campi evidenziati.
Indietro
Avanti
Fine
Logo (PNG o JPG, fino a 2 MB; resta nel tuo browser)
Scegli un file
Massimo 2 MB
Solo PNG o JPG
Carica
Almeno 10
Budget:
Inizia gratis · Nessuna carta di credito richiesta