Transitions asynchrones fluides dans React 19
Vous avez créé un formulaire qui envoie des données à un serveur. L’utilisateur clique sur « Enregistrer », et pendant deux secondes, rien ne se passe. Il clique à nouveau. Vous vous retrouvez maintenant avec des requêtes en double, une interface utilisateur confuse et un utilisateur frustré.
React 19 résout ce problème avec les transitions asynchrones—un changement fondamental dans la façon dont React gère les mises à jour asynchrones. Au lieu de jongler manuellement avec les états de chargement, les indicateurs d’erreur et les conditions de concurrence, React suit désormais automatiquement le travail en attente. Cet article explique en quoi useTransition dans React 19 diffère des patterns de React 18, quand utiliser ces primitives, et comment elles se connectent aux API de navigateur émergentes comme View Transitions.
Points clés à retenir
- Le
startTransitionde React 19 accepte les fonctions asynchrones, suivant automatiquement l’état en attente pendant l’exécution de la transition—réduisant ainsi la manipulation manuelle deisLoading. useTransitionconcerne la priorité des mises à jour, pas l’animation. Utilisez-le pour les soumissions de formulaires, les filtres de recherche et les changements d’onglets—pas pour les entrées contrôlées ou les états d’erreur urgents.- Le hook
useOptimisticse marie bien avec les transitions asynchrones pour afficher instantanément les résultats attendus, avec un retour en arrière automatique en cas d’échec. - Les transitions du planificateur de React et l’API View Transitions du navigateur résolvent des problèmes différents : l’une gère quand les mises à jour sont rendues, l’autre gère comment les éléments s’animent entre les états.
Comment le support asynchrone de startTransition change tout
Dans React 18, startTransition n’acceptait que des fonctions synchrones. Vous pouviez marquer les mises à jour d’état comme étant de faible priorité, mais les opérations asynchrones nécessitaient une gestion séparée de l’état de chargement.
React 19 change cela. Vous pouvez maintenant passer des fonctions asynchrones directement à startTransition :
const [isPending, startTransition] = useTransition()
const handleSubmit = () => {
startTransition(async () => {
const result = await saveToServer(data)
setStatus(result)
})
}
React suit la transition pendant l’exécution de l’action asynchrone. isPending reste à true jusqu’à ce que React termine le traitement du travail de transition.
Important : les mises à jour d’état planifiées après un await peuvent ne pas toujours être incluses automatiquement dans la même transition. Si vous avez besoin que ces mises à jour restent non urgentes, enveloppez-les dans un autre startTransition.
Cela élimine une grande partie du code répétitif qui encombrait les patterns de React 18 :
| Pattern React 18 | Pattern React 19 |
|---|---|
État isLoading manuel | Suivi automatique de isPending |
| Try/catch avec état d’erreur | Intégration des error boundaries |
| Gestion des conditions de concurrence | Séquencement intégré des requêtes |
useTransition dans React 19 : quand l’utiliser
Utilisez useTransition lorsque vous souhaitez que l’interface utilisateur reste réactive pendant les mises à jour coûteuses. Le hook indique à React : « Cette mise à jour peut attendre si quelque chose de plus urgent se produit. »
Bons cas d’usage :
- Soumissions de formulaires où les utilisateurs peuvent continuer à taper
- Filtres de recherche qui déclenchent la récupération de données
- Changements d’onglets qui chargent du nouveau contenu
Évitez les transitions pour :
- Les valeurs d’entrée contrôlées (celles-ci doivent se mettre à jour immédiatement)
- Les états d’erreur critiques nécessitant une visibilité instantanée
- Les simples changements d’état synchrones
L’idée clé : les transitions concernent la priorité, pas l’animation. React interrompra une transition en attente si l’utilisateur tape, fait défiler ou effectue toute interaction urgente.
Interface utilisateur optimiste dans React 19 avec useOptimistic
Le hook useOptimistic se marie naturellement avec les transitions asynchrones. Il vous permet d’afficher immédiatement les résultats attendus pendant que le serveur confirme :
const [optimisticItems, addOptimistic] = useOptimistic(
items,
(current, newItem) => [...current, newItem]
)
const handleAdd = () => {
startTransition(async () => {
addOptimistic({ id: "temp", text: inputValue })
await saveItem(inputValue)
})
}
Si la requête échoue, React revient automatiquement à l’état précédent. Cela crée des améliorations de performance perçue sans logique complexe de réconciliation d’état.
Bien que useOptimistic fonctionne mieux aux côtés des transitions ou des actions asynchrones, il n’est pas strictement requis—le hook peut toujours être utilisé de manière indépendante selon votre flux de données.
Discover how at OpenReplay.com.
Transitions du planificateur vs. API View Transitions
Les transitions de React et l’API View Transitions du navigateur résolvent des problèmes différents :
Les transitions du planificateur (useTransition) gèrent quand React effectue le rendu des mises à jour. Elles gèrent la priorité et la réactivité.
Les view transitions gèrent comment les éléments s’animent entre les états. Elles gèrent la continuité visuelle.
React expérimente un composant <ViewTransition> qui fait le pont entre les deux. Cependant, cela reste expérimental. L’API du navigateur elle-même bénéficie d’un support large dans les principaux navigateurs, notamment Chrome, Edge, Safari et Firefox.
Si vous explorez les view transitions aujourd’hui :
- Utilisez
document.startViewTransition()avec détection de fonctionnalité - Fournissez des solutions de repli gracieuses pour les navigateurs non pris en charge
- Évitez de vous appuyer sur des intégrations de framework expérimentales en production
Recommandations pratiques
À faire :
- Envelopper les soumissions de formulaires et les mutations de données dans
startTransition - Utiliser
isPendingpour désactiver les boutons et afficher des indicateurs de chargement - Combiner avec
useOptimisticpour un retour instantané sur les opérations prévisibles
À ne pas faire :
- Envelopper chaque mise à jour d’état dans une transition
- Utiliser des transitions pour les retours d’interface utilisateur urgents comme les erreurs de validation
- Supposer que l’API View Transitions fonctionne partout
Conclusion
Les transitions asynchrones de React 19 éliminent une grande partie de la logique manuelle d’état de chargement qui encombrait les applications React 18. En passant des fonctions asynchrones à startTransition, vous obtenez un suivi intégré de l’état en attente, une meilleure performance perçue et une meilleure intégration avec les patterns modernes de React.
Commencez par remplacer vos états isLoading manuels par useTransition. Ajoutez useOptimistic là où le retour instantané compte. Laissez l’intégration expérimentale de View Transitions pour quand le support des navigateurs sera mature.
FAQ
Oui. Dans React 19, les Server Actions déclenchées depuis des composants clients peuvent être enveloppées dans startTransition. Cela vous permet de suivre l'état en attente des mutations côté serveur directement depuis le client, vous donnant un suivi automatique de isPending sans variables d'état de chargement supplémentaires.
Les erreurs levées pendant une transition se propagent vers l'error boundary la plus proche si elle existe. Sans error boundary, l'erreur apparaîtra comme toute autre erreur de rendu, donc les applications en production doivent s'assurer que des boundaries sont en place. Toutes les mises à jour optimistes effectuées via useOptimistic sont généralement annulées lorsque la transition est abandonnée.
Oui. Bien que couramment associé aux transitions ou aux actions asynchrones, useOptimistic peut fonctionner seul. Le coupler avec des transitions améliore simplement la réactivité perçue pendant les mises à jour non urgentes.
Pas nécessairement. useTransition marque les mises à jour comme non urgentes, ce qui signifie que React peut retarder leur rendu. Pour les cas où vous avez besoin d'un retour d'interface utilisateur immédiat, comme les erreurs de validation en ligne ou le basculement d'une modale, un simple booléen useState reste le bon choix. Réservez les transitions pour les opérations où la réactivité compte plus que l'immédiateté.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.