Comment créer des formulaires avec les Server Actions
Les Server Actions de React sont des fonctions serveur qui s'exécutent côté serveur. Elles peuvent être appelées dans les composants Serveur et Client pour gérer les soumissions de formulaires. Ce guide vous montrera comment créer des formulaires dans Next.js avec les Server Actions.
Fonctionnement
React étend l'élément HTML <form>
pour permettre l'invocation des Server Actions via l'attribut action
.
Lorsqu'elle est utilisée dans un formulaire, la fonction reçoit automatiquement l'objet FormData
. Vous pouvez ensuite extraire les données en utilisant les méthodes natives de FormData :
Bon à savoir : Pour les formulaires avec plusieurs champs, vous pouvez utiliser la méthode
entries()
avecObject.fromEntries()
de JavaScript. Par exemple :const rawFormData = Object.fromEntries(formData)
.
Passage d'arguments supplémentaires
En dehors des champs de formulaire, vous pouvez passer des arguments supplémentaires à une fonction serveur en utilisant la méthode JavaScript bind
. Par exemple, pour passer l'argument userId
à la fonction serveur updateUser
:
La fonction serveur recevra userId
comme argument supplémentaire :
Bon à savoir :
- Une alternative consiste à passer les arguments sous forme de champs cachés dans le formulaire (par exemple
<input type="hidden" name="userId" value={userId} />
). Cependant, la valeur fera partie du HTML rendu et ne sera pas encodée.bind
fonctionne dans les composants Serveur et Client et prend en charge l'amélioration progressive.
Validation des formulaires
Les formulaires peuvent être validés côté client ou serveur.
- Pour la validation côté client, vous pouvez utiliser les attributs HTML comme
required
ettype="email"
pour une validation basique. - Pour la validation côté serveur, vous pouvez utiliser une bibliothèque comme zod pour valider les champs du formulaire. Par exemple :
Erreurs de validation
Pour afficher les erreurs ou messages de validation, transformez le composant qui définit le <form>
en composant Client et utilisez useActionState
de React.
Avec useActionState
, la signature de la fonction serveur changera pour recevoir un nouveau paramètre prevState
ou initialState
comme premier argument.
Vous pouvez ensuite afficher conditionnellement le message d'erreur en fonction de l'objet state
.
États d'attente
Le hook useActionState
expose un booléen pending
qui peut être utilisé pour afficher un indicateur de chargement ou désactiver le bouton de soumission pendant l'exécution de l'action.
Alternativement, vous pouvez utiliser le hook useFormStatus
pour afficher un indicateur de chargement pendant l'exécution de l'action. Avec ce hook, vous devrez créer un composant séparé pour afficher l'indicateur. Par exemple, pour désactiver le bouton pendant l'attente :
Vous pouvez ensuite imbriquer le composant SubmitButton
dans le formulaire :
Bon à savoir : Dans React 19,
useFormStatus
inclut des clés supplémentaires sur l'objet retourné, comme data, method et action. Si vous n'utilisez pas React 19, seule la clépending
est disponible.
Mises à jour optimistes
Vous pouvez utiliser le hook React useOptimistic
pour mettre à jour l'interface de manière optimiste avant que la fonction serveur ne termine son exécution, plutôt que d'attendre la réponse :
Éléments de formulaire imbriqués
Vous pouvez appeler des Server Actions dans des éléments imbriqués à l'intérieur de <form>
comme <button>
, <input type="submit">
et <input type="image">
. Ces éléments acceptent la prop formAction
ou des gestionnaires d'événements.
C'est utile lorsque vous souhaitez appeler plusieurs Server Actions dans un formulaire. Par exemple, vous pouvez créer un élément <button>
spécifique pour enregistrer un brouillon de publication en plus de le publier. Voir la documentation React sur <form>
pour plus d'informations.
Soumission programmatique de formulaire
Vous pouvez déclencher une soumission de formulaire programmatiquement en utilisant la méthode requestSubmit()
. Par exemple, lorsque l'utilisateur soumet un formulaire avec le raccourci clavier ⌘
+ Entrée
, vous pouvez écouter l'événement onKeyDown
:
Cela déclenchera la soumission du <form>
ancêtre le plus proche, ce qui invoquera la fonction serveur.