Implémenter manuellement des mises à jour optimistes
Appliquez localement l’état optimiste, placez la mutation en file d’attente et gérez explicitement les cas de réussite et d’échec
Implémenter manuellement des mises à jour optimistes est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.
L'état avant la modification
Les mises à jour optimistes manuelles commencent par l'état local du composant, initialisé à partir des données du serveur : const [items, setItems] = useState(serverItems). C'est cet état local que vous affichez et que vous modifiez de manière optimiste. Vous ne devez NOT modifier directement les données récupérées du serveur : conservez une copie locale que vous contrôlez.
L'étape de mise à jour optimiste
Lorsque l'utilisateur déclenche une modification (en cliquant sur « Ajouter », « J'aime » ou « Supprimer »), effectuez immédiatement la mise à jour de l'état avant d'appeler l'API : setItems(prev => [...prev, newItem]). L'interface reflète instantanément le changement. Ce n'est qu'après cette mise à jour que vous lancez la véritable requête réseau.
Capturer l'état précédent
Avant d'effectuer la mise à jour optimiste, capturez l'état actuel : const previousItems = items. Cet instantané est la cible de votre restauration. Si l'appel à l'API échoue, vous restaurez cette valeur. Stockez-la dans une variable (et non dans l'état), puisque vous n'en avez besoin que pendant la durée de la modification en attente.
Effectuer l'appel à l'API
Après la mise à jour optimiste, effectuez l'appel à l'API de manière asynchrone. Placez-le dans un bloc try/catch. En cas de réussite, vous pouvez éventuellement récupérer de nouveau les données pour les synchroniser avec l'état du serveur, ou faire confiance à l'état optimiste si le serveur renverrait les mêmes données. En cas d'échec, utilisez l'état précédent capturé pour effectuer la restauration.
Restaurer après un échec
Dans le bloc catch de votre modification : setItems(previousItems). Cela restaure l'état tel qu'il était avant la mise à jour optimiste. Affichez ensuite une notification d'erreur. Les utilisateurs comprennent que des échecs rares peuvent survenir ; ce qu'ils ne tolèrent pas, c'est une incohérence silencieuse.
Afficher une notification d'erreur en cas d'échec
Après la restauration, affichez un message d'erreur : « Impossible d'enregistrer les modifications. Veuillez réessayer. » avec un bouton Réessayer qui relance la même modification. Les utilisateurs gardent ainsi le contrôle. L'association restauration + notification d'erreur + nouvelle tentative gère élégamment l'échec sans bloquer toute l'interface.
Le problème de l'identifiant temporaire
Lorsque vous ajoutez un nouvel élément de manière optimiste, le serveur ne lui a pas encore attribué d'identifiant réel. Créez un identifiant temporaire pour l'élément optimiste : const tempId = crypto.randomUUID(). Utilisez-le comme clé de l'élément dans la liste. Une fois la réponse de l'API reçue avec succès, remplacez l'identifiant temporaire par l'identifiant réel attribué par le serveur.
Réconcilier les identifiants temporaires
Après la réussite de la modification de création, le serveur renvoie l'identifiant réel. Mettez à jour votre état pour remplacer l'élément temporaire : setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item)). Cette réconciliation garantit que les opérations suivantes utilisent le bon identifiant serveur.
Le problème de la condition de concurrence
Si l'utilisateur déclenche deux modifications à la suite, les réponses peuvent arriver dans le désordre. La réponse de la seconde modification peut arriver avant celle de la première, et la restauration de la première peut écraser l'état correct produit par la seconde. Il s'agit d'une condition de concurrence propre aux interfaces optimistes.
Sérialiser les mutations pour éviter les conditions de course
Une solution aux conditions de course consiste à sérialiser les mutations à l’aide d’une file d’attente. Tant qu’une mutation est en cours, désactivez le bouton déclencheur (en définissant l’état isSubmitting sur vrai). N’autorisez la mutation suivante qu’une fois la précédente terminée. Cela réduit quelque peu la réactivité, mais garantit l’ordre correct des mises à jour de l’état.
Schéma de suppression optimiste
Pour les opérations de suppression : capturez les éléments précédents, retirez de l’état l’élément supprimé, appelez l’API de suppression, puis annulez l’opération en cas d’échec. La suppression est plus simple que la création (aucune résolution d’ID n’est nécessaire), mais les mêmes principes s’appliquent. Envisagez d’ajouter un bref délai avant la suppression (en affichant une option « annuler ») avant d’appeler l’API.
ID temporaire dans les mises à jour optimistes
Pourquoi les éléments ajoutés de manière optimiste ont-ils besoin d’un ID temporaire ?
Récapitulatif de la leçon : mises à jour optimistes manuelles
Le schéma manuel : capturez previousItems, utilisez setItems avec le nouvel état, appelez l’API, annulez l’opération en cas d’échec avec setItems(previousItems) et affichez une erreur. Pour les ajouts, utilisez crypto.randomUUID() comme ID temporaire et remplacez-le par l’ID du serveur en cas de réussite. Évitez les conditions de course en désactivant le déclencheur pendant les mutations en cours. Annulation + notification + nouvelle tentative constituent l’expérience utilisateur standard en cas d’échec.
Questions Fréquemment Posées
La leçon « Implémenter manuellement des mises à jour optimistes » est-elle gratuite ?
Oui — le texte complet de « Implémenter manuellement des mises à jour optimistes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Implémenter manuellement des mises à jour optimistes » ?
Appliquez localement l’état optimiste, placez la mutation en file d’attente et gérez explicitement les cas de réussite et d’échec Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer React Academy ?
Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Implémenter manuellement des mises à jour optimistes » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon React Academy ?
Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Qu’est-ce qu’une interface optimiste et quand l’utiliser
- Implémenter manuellement des mises à jour optimistes
- Retour à l’état précédent en cas d’erreur et résolution des conflits
- Modèles optimistes avec React Query et Zustand