Un cas d'utilisation courant dans les applications React consiste à effectuer une mutation de données, puis à mettre à jour l'état en réponse. Par exemple, lorsqu'un utilisateur soumet un formulaire pour modifier son nom, vous effectuerez une requête API, puis gérerez la réponse. Dans le passé, vous deviez gérer manuellement les états en attente, les erreurs, les mises à jour optimistes et les demandes séquentielles.
Par exemple, vous pouvez gérer l'état d'attente et d'erreur dans useState :
// Before Actions function UpdateName({}) { const [name, setName] = useState(""); const [error, setError] = useState(null); const [isPending, setIsPending] = useState(false); const handleSubmit = async () => { setIsPending(true); const error = await updateName(name); setIsPending(false); if (error) { setError(error); return; } redirect("/path"); }; return ( <div> <input value={name} onChange={(event) => setName(event.target.value)} /> <button onClick={handleSubmit} disabled={isPending}> Update </button> {error && <p>{error}</p>} </div> ); }
Dans React 19, nous ajoutons la prise en charge de l'utilisation de fonctions asynchrones dans les transitions pour gérer automatiquement les états en attente, les erreurs, les formulaires et les mises à jour optimistes.
Par exemple, vous pouvez utiliser useTransition pour gérer l'état en attente pour vous :
// Using pending state from Actions function UpdateName({}) { const [name, setName] = useState(""); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); const handleSubmit = () => { startTransition(async () => { const error = await updateName(name); if (error) { setError(error); return; } redirect("/path"); }) }; return ( <div> <input value={name} onChange={(event) => setName(event.target.value)} /> <button onClick={handleSubmit} disabled={isPending}> Update </button> {error && <p>{error}</p>} </div> ); }
La transition asynchrone définira immédiatement l'état isPending sur true, effectuera la ou les requêtes asynchrones et fera passer isPending à false après toute transition. Cela vous permet de garder l'interface utilisateur actuelle réactive et interactive pendant que les données changent.
Par convention, les fonctions qui utilisent des transitions asynchrones sont appelées « Actions ».
Les actions gèrent automatiquement la soumission des données pour vous :
État en attente : les actions fournissent un état en attente qui démarre au début d'une requête et se réinitialise automatiquement lorsque la mise à jour de l'état final est validée.
Mises à jour optimistes : les actions prennent en charge le nouveau hook useOptimistic afin que vous puissiez afficher des commentaires instantanés aux utilisateurs pendant la soumission des demandes.
Gestion des erreurs : les actions assurent la gestion des erreurs afin que vous puissiez afficher les limites d'erreur lorsqu'une demande échoue et rétablir automatiquement les mises à jour optimistes à leur valeur d'origine.
Formulaires :
S'appuyant sur les actions, React 19 introduit useOptimistic pour gérer les mises à jour optimistes, et un nouveau hook React.useActionState pour gérer les cas courants pour les actions. Dans React-dom, nous ajoutons