Aggiungi un modulo a un'app React esistente
In questa guida aggiungi il modulo di apertura pratiche a un'applicazione React che hai già. Alla fine:
- il modulo funziona in una pagina della tua applicazione;
- ogni invio arriva alla tua API come record strutturato;
- il tuo server controlla di nuovo il record prima di salvarlo; e
- un salvataggio non riuscito mostra un messaggio e conserva ciò che l'utente ha inserito.
Tempo: circa 20 minuti.
Prima di iniziare
- Node.js
22o versione successiva - Un'applicazione React 18 o 19. I passaggi usano Vite. Con un altro strumento di build, adatta il passaggio del proxy.
box-sizing: border-boxsu tutti gli elementi. La maggior parte dei reset CSS lo imposta, compreso quello di Tailwind. Senza questa regola, i campi del modulo escono dal loro contenitore.
Per seguire la guida con una nuova applicazione, creala con Vite:
Code
Poi sostituisci il contenuto di src/index.css con questa regola. Imposta box-sizing e rimuove il
testo centrato del modello:
Code
Aggiungi il modulo
-
Installa i pacchetti form0:
Code -
Scarica lo schema di Crea un modulo di apertura pratiche. Se hai già creato quel modulo, copia il tuo
schema.jsonin questo percorso.Code -
Crea
src/CaseIntakeForm.jsx:CoderecordKindindica a form0 se questo modulo crea un nuovo record o ne apre uno salvato, eFormRendererlo richiede.formWidthimposta la larghezza massima del modulo, che per impostazione predefinita è30vw. -
Mostra il modulo in una pagina. In una nuova applicazione Vite, sostituisci il contenuto di
src/App.jsx:CodeNella tua applicazione, visualizza
<CaseIntakeForm />nella pagina in cui deve trovarsi il modulo. -
Avvia l'applicazione e apri l'URL mostrato, di solito
http://localhost:5173:CodeCompila i campi obbligatori e fai clic su Submit. La console del browser mostra il record strutturato.
FormRenderer mostra la sua intestazione standard, il pannello di navigazione e i metadati del
record. Per cambiare l'aspetto del modulo, vedi Temi e stili.

Invia i record alla tua API
-
Sostituisci
src/CaseIntakeForm.jsxcon questa versione, che invia ogni record a/api/cases:CodeQui contano tre dettagli:
fetchnon rifiuta la promise con una risposta500, quindi il codice controllaresponse.oke genera un errore.- Il blocco
catchmostra un messaggio e poi rilancia l'errore. Senza ilthrow,FormRendererconsidera riuscito il salvataggio. - Cambiare
keysostituisce il modulo con uno nuovo e vuoto dopo un salvataggio riuscito.
-
Crea
server/cases-api.mjs. Questo esempio usa solo Node.js eform0-core:CodeIl server legge lo stesso file di schema del modulo, quindi entrambi applicano le stesse regole. Crea un nuovo valutatore per ogni richiesta perché una chiamata a
prepareSubmission()annulla qualsiasi chiamata precedente ancora in corso sullo stesso valutatore. -
Inoltra le richieste
/apia quel server durante lo sviluppo. Sostituiscivite.config.jscon:Code -
Avvia l'API in un secondo terminale, dalla radice del progetto:
CodeMostra
Cases API listening on port 3001.
Prova
Lascia in esecuzione entrambi i terminali, apri il modulo e segui questi passaggi.
-
Invia un modulo vuoto. Fai clic su Submit. I campi obbligatori mostrano i loro messaggi e il terminale dell'API non mostra nulla.
-
Salva una pratica. Compila Full name, scegli Email come metodo di contatto, poi compila Email e Summary. Scegli My team, rispondi Yes a Is work blocked?, compila Describe the business impact e fai clic su Submit. La pagina mostra Case saved., il modulo si svuota e il terminale dell'API mostra
Saved case:conpriority: 'high'. -
Fai fallire un salvataggio. Ferma l'API con
Ctrl+C, compila di nuovo il modulo e fai clic su Submit. La pagina mostra The case was not saved. Try again., i tuoi valori restano nel modulo e la console del browser mostra[form0-react] Submit failed during onSubmit. -
Riprova. Avvia di nuovo l'API e fai clic su Submit. La pratica viene salvata.
-
Invia un record incompleto. Chiama direttamente l'API, senza il modulo:
CodeIl server risponde
422ed elenca i campi mancanti. -
Invia una priorità errata. Salva questo record come
tampered-case.json. Le sue risposte danno una prioritàlow, ma il record indicahigh:CodeInvialo all'API:
CodeIl server risponde
201e il terminale dell'API mostrapriority: 'low'. Il server calcola da solo i campi calcolati.
Come funziona
La validazione viene eseguita due volte
FormRenderer valida nel browser, quindi l'utente riceve un riscontro immediato e onSubmit viene
eseguito solo con un modulo valido. Un client può saltare questo passaggio, perciò checkRecord()
ripete il controllo sul server:
buildFormRecordSnapshot()riconverte il record ricevuto in valori del modulo e rimuove i campi che non sono nello schema. Genera un errore se il record è malformato, e il server risponde400.prepareSubmission()esegue di nuovo i calcoli e applica le regole dello schema.eligibleindica se il record ha superato il controllo.createStructuredRecord()crea il record da salvare a partire dai valori controllati, quindi contiene i risultati calcolati dal server.
Cosa copre il controllo del server
Il server applica le regole del tuo schema e controlla che ogni valore abbia il tipo corretto:
| Un client invia | Risultato |
|---|---|
| Un campo obbligatorio vuoto, compreso uno obbligatorio per condizione | Rifiutato con 422 |
| Un valore di scelta che non è nello schema | Rifiutato con 422 |
| Un valore calcolato modificato | Sostituito dal risultato del server |
| Un campo che non è nello schema | Rimosso |
| Un campo di scelta con una struttura errata | Rifiutato con 400 |
Una data malformata, come not-a-date | Rifiutata con 422 |
Un numero in un TextField | Rifiutato con 422 |
| Un valore del tipo sbagliato in un campo nascosto | Rifiutato con 422 |
| Un valore valido in un campo nascosto | Salvato con il record |
Il server rifiuta un tipo sbagliato in un campo nascosto perché checkRecord() passa
validateHiddenValues: true. Un valore valido resta perché form0 conserva i valori nascosti per
impostazione predefinita. Per cancellare un campo quando viene nascosto, imposta
"visible_preserve_value": false nello schema.
Questi controlli conoscono solo il tuo schema. Aggiungi i tuoi controlli prima di salvare, ad esempio se questo utente può creare la pratica.
Prima della produzione
Questo esempio resta breve perché le chiamate a form0 siano facili da vedere. Prima di usarlo davvero:
- Aggiungi autenticazione e un limite alla dimensione delle richieste.
- Salva
checkedRecordnel tuo database invece di stamparlo. I connettori possono archiviare i record form0 in PostgreSQL o SQLite. - Tieni lo schema sul tuo server. Non accettare mai uno schema da un client, perché gli schemi contengono codice che viene eseguito sul tuo server.
Dove andare ora
- Valori, snapshot e invio: ripristinare record salvati e osservare le bozze.
- FormRenderer: tutte le proprietà del componente.
- Output e record: la struttura del record che ricevi.