useFormStatus
useFormStatus est un Hook qui vous fournit des informations d’état sur le dernier envoi de formulaire parent.
const { pending, data, method, action } = useFormStatus();Référence
useFormStatus()
Le Hook useFormStatus vous fournit des informations d’état sur le dernier envoi de formulaire parent.
import { useFormStatus } from "react-dom";
import action from './actions';
function Submit() {
const status = useFormStatus();
return <button disabled={status.pending}>Envoyer</button>
}
export default function App() {
return (
<form action={action}>
<Submit />
</form>
);
}Pour récupérer les informations d’état, le composant Submit doit être utilisé au sein d’un <form>. Le Hook renvoie des informations telles que la propriété pending, qui vous indique si le formulaire est en cours d’envoi.
Dans l’exemple ci-dessus, Submit utilise cette information pour désactiver l’interactivité du <button> pendant l’envoi du formulaire.
Voir plus d’exemples ci-dessous.
Paramètres
useFormStatus ne prend aucun paramètre.
Valeur renvoyée
Un objet status doté des propriétés suivantes :
-
pending: un booléen. Vauttruesi le<form>parent est en cours d’envoi, sinonfalse. -
data: un objet qui implémente l’interfaceFormData, contenant les données que le<form>parent est en train d’envoyer. Si aucun envoi n’est en cours, ou s’il n’y a pas de<form>parent, cette propriété vautnull. -
method: une chaîne de caractères valant soit'get', soit'post', selon que le<form>parent est en train de faire un envoi avec une méthode HTTPGETouPOST. Par défaut, un<form>utilisera la méthodeGET, mais ça peut être spécifié par l’attributmethod.
action: une référence vers la fonction passée à la propactiondu<form>parent. S’il n’y a pas de<form>parent, cette propriété vautnull. Si la propactiona reçu une valeur URI, ou si aucune propactionn’est spécifiée, cette propriété vautnull.
Limitations
- Le Hook
useFormStatusdoit être appelé dans un composant dont le rendu a lieu au sein d’un<form>. useFormStatusne renverra que les informations d’état du<form>parent. Il ne renverra pas les informations de statut d’un<form>placé dans le rendu du composant courant ou de ses composants enfants.
Utilisation
Afficher un état d’attente pendant l’envoi du formulaire
Pour afficher un état d’attente pendant que le formulaire est en cours d’envoi, vous pouvez utilisez le Hook useFormStatus dans un composant au sein du <form> et lire la propriété pending qu’il renvoie.
Nous utilisons ci-dessous la propriété pending pour indiquer que le formulaire est en cours d’envoi.
import { useFormStatus } from "react-dom"; import { submitForm } from "./actions.js"; function Submit() { const { pending } = useFormStatus(); return ( <button type="submit" disabled={pending}> {pending ? "Envoi en cours..." : "Envoyer"} </button> ); } function Form({ action }) { return ( <form action={action}> <Submit /> </form> ); } export default function App() { return <Form action={submitForm} />; }
Lire les données en cours d’envoi
Vous pouvez utiliser la propriété data des informations d’état renvoyées par useFormStatus pour afficher les données que l’utilisateur est en train d’envoyer.
Dans l’exemple ci-dessous, nous avons un formulaire permettant à l’utilisateur de réserver un identifiant. Nous pouvons y utiliser useFormStatus pour afficher un message temporaire confirmant l’identifiant demandé.
import {useState, useMemo, useRef} from 'react'; import {useFormStatus} from 'react-dom'; export default function UsernameForm() { const {pending, data} = useFormStatus(); return ( <div> <h3>Réserver l’identifiant : </h3><br /> <input type="text" name="username" disabled={pending} /> <button type="submit" disabled={pending}> Envoyer </button> <br /> <p>{data ? `Récupération de ${data?.get('username')}...` : ''}</p> </div> ); }
Dépannage
status.pending ne vaut jamais true
useFormStatus ne renvoie d’informations d’état que pour un <form> parent.
Si le composant qui appelle useFormStatus n’est pas imbriqué dans un <form>, status.pending vaudra toujours false. Vérifiez que useFormStatus est appelé depuis un composant qui figure à l’intérieur d’un élément <form>.
useFormStatus ne surveillera pas l’état d’un <form> situé dans le rendu du même composant. Consultez le Piège pour en savoir plus.