Ajouter un formulaire à une application React existante
Dans ce guide, vous ajoutez le formulaire d’ouverture de dossier à une application React existante. À la fin :
- le formulaire s’exécute sur une page de votre application ;
- chaque soumission arrive à votre propre API sous forme d’enregistrement structuré ;
- votre serveur vérifie à nouveau l’enregistrement avant de le sauvegarder ; et
- un échec d’enregistrement affiche un message et conserve ce que l’utilisateur a saisi.
Temps : environ 20 minutes.
Avant de commencer
- Node.js
22ou version ultérieure - Une application React 18 ou 19. Les étapes utilisent Vite. Avec un autre outil de build, adaptez l’étape du proxy.
box-sizing: border-boxsur tous les éléments. La plupart des resets CSS le définissent, y compris celui de Tailwind. Sans cela, les champs du formulaire débordent de leur conteneur.
Pour suivre le guide avec une nouvelle application, créez-la avec Vite :
Code
Remplacez ensuite le contenu de src/index.css par cette règle. Elle définit box-sizing et retire
le texte centré du modèle :
Code
Ajouter le formulaire
-
Installez les paquets form0 :
Code -
Téléchargez le schéma de Créer un formulaire d’ouverture de dossier. Si vous avez déjà créé ce formulaire, copiez votre propre
schema.jsonà cet emplacement.Code -
Créez
src/CaseIntakeForm.jsx:CoderecordKindindique à form0 si ce formulaire crée un nouvel enregistrement ou en ouvre un déjà sauvegardé, etFormRendererl’exige.formWidthdéfinit la largeur maximale du formulaire, qui vaut30vwpar défaut. -
Affichez le formulaire sur une page. Dans une nouvelle application Vite, remplacez le contenu de
src/App.jsx:CodeDans votre propre application, affichez
<CaseIntakeForm />sur la page où le formulaire doit se trouver. -
Lancez l’application et ouvrez l’URL affichée, généralement
http://localhost:5173:CodeRemplissez les champs obligatoires et cliquez sur Submit. La console du navigateur affiche l’enregistrement structuré.
FormRenderer affiche son en-tête standard, le panneau de navigation et les métadonnées de
l’enregistrement. Pour changer l’apparence du formulaire, consultez
Thèmes et styles.

Envoyer les enregistrements à votre API
-
Remplacez
src/CaseIntakeForm.jsxpar cette version, qui envoie chaque enregistrement à/api/cases:CodeTrois détails comptent ici :
fetchne rejette pas la promesse sur une réponse500: le code vérifie doncresponse.oket lève une erreur.- Le bloc
catchaffiche un message, puis relance l’erreur. Sans lethrow,FormRendererconsidère que l’enregistrement a réussi. - Modifier
keyremplace le formulaire par un nouveau formulaire vide après un enregistrement réussi.
-
Créez
server/cases-api.mjs. Cet exemple utilise seulement Node.js etform0-core:CodeLe serveur lit le même fichier de schéma que le formulaire, de sorte que les deux appliquent les mêmes règles. Il crée un nouvel évaluateur pour chaque requête, car un appel à
prepareSubmission()annule tout appel précédent encore en cours sur le même évaluateur. -
Redirigez les requêtes
/apivers ce serveur pendant le développement. Remplacezvite.config.jspar :Code -
Lancez l’API dans un deuxième terminal, depuis la racine du projet :
CodeElle affiche
Cases API listening on port 3001.
Essayez
Laissez les deux terminaux en marche, ouvrez le formulaire et suivez ces étapes.
-
Soumettez un formulaire vide. Cliquez sur Submit. Les champs obligatoires affichent leurs messages et le terminal de l’API n’affiche rien.
-
Enregistrez un dossier. Remplissez Full name, choisissez Email comme mode de contact, puis remplissez Email et Summary. Choisissez My team, répondez Yes à Is work blocked?, remplissez Describe the business impact et cliquez sur Submit. La page affiche Case saved., le formulaire se vide et le terminal de l’API affiche
Saved case:avecpriority: 'high'. -
Provoquez un échec. Arrêtez l’API avec
Ctrl+C, remplissez à nouveau le formulaire et cliquez sur Submit. La page affiche The case was not saved. Try again., vos valeurs restent dans le formulaire et la console du navigateur affiche[form0-react] Submit failed during onSubmit. -
Réessayez. Relancez l’API et cliquez sur Submit. Le dossier est enregistré.
-
Envoyez un enregistrement incomplet. Appelez directement l’API, sans le formulaire :
CodeLe serveur répond
422et liste les champs manquants. -
Envoyez une priorité incorrecte. Enregistrez ce contenu sous le nom
tampered-case.json. Ses réponses donnent une prioritélow, mais il indiquehigh:CodeEnvoyez-le à l’API :
CodeLe serveur répond
201et le terminal de l’API affichepriority: 'low'. Le serveur calcule lui-même les champs calculés.
Comment ça marche
La validation s’exécute deux fois
FormRenderer valide dans le navigateur : l’utilisateur obtient un retour immédiat et onSubmit ne
s’exécute que pour un formulaire valide. Un client peut contourner cette étape, donc checkRecord()
répète la vérification sur le serveur :
buildFormRecordSnapshot()reconvertit l’enregistrement reçu en valeurs de formulaire et supprime les champs absents du schéma. Il lève une erreur si l’enregistrement est mal formé, et le serveur répond400.prepareSubmission()relance les calculs et applique les règles du schéma.eligibleindique si l’enregistrement a passé la vérification.createStructuredRecord()construit l’enregistrement à sauvegarder à partir des valeurs vérifiées : il contient donc les résultats calculés par le serveur.
Ce que couvre la vérification du serveur
Le serveur applique les règles de votre schéma et vérifie que chaque valeur a le bon type :
| Un client envoie | Résultat |
|---|---|
| Un champ obligatoire vide, y compris un champ obligatoire sous condition | Rejeté avec 422 |
| Une valeur de choix absente du schéma | Rejetée avec 422 |
| Une valeur calculée modifiée | Remplacée par le résultat du serveur |
| Un champ absent du schéma | Supprimé |
| Un champ de choix avec une structure incorrecte | Rejeté avec 400 |
Une date mal formée, comme not-a-date | Rejetée avec 422 |
Un nombre dans un TextField | Rejeté avec 422 |
| Une valeur du mauvais type dans un champ masqué | Rejetée avec 422 |
| Une valeur valide dans un champ masqué | Sauvegardée avec l’enregistrement |
Le serveur rejette un mauvais type dans un champ masqué parce que checkRecord() passe
validateHiddenValues: true. Une valeur valide reste, car form0 conserve les valeurs masquées par
défaut. Pour effacer un champ lorsqu’il est masqué, définissez
"visible_preserve_value": false dans le schéma.
Ces contrôles ne connaissent que votre schéma. Ajoutez vos propres contrôles avant de sauvegarder, par exemple pour vérifier que cet utilisateur peut créer le dossier.
Avant la mise en production
Cet exemple reste court pour que les appels à form0 soient faciles à voir. Avant de l’utiliser pour de vrai :
- Ajoutez une authentification et une limite de taille des requêtes.
- Sauvegardez
checkedRecorddans votre base de données au lieu de l’afficher. Les connecteurs peuvent stocker des enregistrements form0 dans PostgreSQL ou SQLite. - Gardez le schéma sur votre serveur. N’acceptez jamais un schéma venant d’un client, car les schémas contiennent du code qui s’exécute sur votre serveur.
Pour aller plus loin
- Valeurs, snapshots et soumission : restaurer des enregistrements sauvegardés et observer les brouillons.
- FormRenderer : toutes les propriétés du composant.
- Sortie et enregistrements : la structure de l’enregistrement que vous recevez.