Back

Transitions asynchrones fluides dans React 19

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 startTransition de 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 de isLoading.
  • useTransition concerne 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 useOptimistic se 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 18Pattern React 19
État isLoading manuelSuivi automatique de isPending
Try/catch avec état d’erreurIntégration des error boundaries
Gestion des conditions de concurrenceSé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.

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 isPending pour désactiver les boutons et afficher des indicateurs de chargement
  • Combiner avec useOptimistic pour 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.

OpenReplay