Implementar actualizaciones optimistas manualmente
Aplicar el estado optimista localmente, poner en cola la mutación y gestionar explícitamente los casos de éxito y error
Implementar actualizaciones optimistas manualmente es una lección gratuita de React Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
Estado anterior a la mutación
Las actualizaciones optimistas manuales comienzan con un estado local del componente inicializado a partir de los datos del servidor: const [items, setItems] = useState(serverItems). Este estado local es lo que renderiza y lo que modificará de forma optimista. NO debe mutar directamente los datos obtenidos del servidor; conserve una copia local que pueda controlar.
El paso de la actualización optimista
Cuando el usuario inicia una mutación (al pulsar «Añadir», «Me gusta» o «Eliminar»), actualice el estado inmediatamente antes de llamar a la API: setItems(prev => [...prev, newItem]). La UI refleja el cambio al instante. Solo después de esta actualización debe enviar la solicitud de red real.
Capturar el estado anterior
Antes de realizar la actualización optimista, capture el estado actual: const previousItems = items. Esta instantánea es el objetivo de la reversión. Si la llamada a la API falla, restaure este valor. Guárdelo en una variable, no en el estado, ya que solo lo necesita mientras la mutación esté pendiente.
Realizar la llamada a la API
Después de la actualización optimista, realice la llamada a la API de forma asíncrona. Envuélvala en try/catch. Si tiene éxito, puede volver a solicitar los datos opcionalmente para sincronizarlos con el estado del servidor, o confiar en el estado optimista si el servidor devolvería los mismos datos. Si falla, utilice el estado anterior capturado para revertir el cambio.
Revertir en caso de fallo
En el bloque catch de la mutación, ejecute: setItems(previousItems). Esto restaura el estado que había antes de la actualización optimista. Después de la reversión, muestre una notificación de error. Los usuarios entienden que pueden producirse fallos poco frecuentes; lo que no toleran es una incoherencia silenciosa.
Mostrar una notificación toast de error
Después de revertir el cambio, muestre un mensaje de error: «No se han podido guardar los cambios. Inténtelo de nuevo.» con un botón Reintentar que vuelva a activar la misma mutación. Esto permite que los usuarios decidan cómo actuar. La combinación de reversión, notificación toast de error y reintento gestiona el fallo con elegancia sin bloquear toda la UI.
El problema de los IDs temporales
Al añadir un elemento de forma optimista, el servidor todavía no le ha asignado un ID real. Cree un ID temporal para el elemento optimista: const tempId = crypto.randomUUID(). Utilícelo como clave del elemento en la lista. Cuando la API responda correctamente, sustituya el ID temporal por el ID real asignado por el servidor.
Conciliar los IDs temporales
Después de una mutación de creación correcta, el servidor responde con el ID real. Actualice el estado para sustituir el elemento temporal: setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item)). Esta conciliación garantiza que las operaciones posteriores utilicen el ID correcto del servidor.
El problema de las condiciones de carrera
Si el usuario inicia dos mutaciones en rápida sucesión, las respuestas pueden llegar en un orden distinto. La respuesta de la segunda mutación puede llegar antes que la de la primera, y la reversión de la primera podría sobrescribir el estado correcto de la segunda. Esta es una condición de carrera propia de la UI optimista.
Serialización de mutaciones para evitar condiciones de carrera
Una solución para las condiciones de carrera es serializar las mutaciones mediante una cola. Mientras una mutación está en curso, deshabilite el botón disparador (estableciendo el estado isSubmitting en true). Permita la siguiente mutación solo después de que se complete la anterior. Esto sacrifica algo de capacidad de respuesta, pero garantiza que el estado se actualice en el orden correcto.
Patrón de eliminación optimista
Para las operaciones de eliminación: capture los elementos anteriores, filtre el elemento eliminado del estado, llame a la API de eliminación y revierta los cambios si falla. Eliminar es más sencillo que crear (no es necesario reconciliar identificadores), pero se aplican los mismos principios. Considere añadir un breve retraso antes de eliminar (mostrando una opción de "deshacer") antes de realizar la llamada a la API.
ID temporal en las actualizaciones optimistas
¿Por qué los elementos añadidos de forma optimista necesitan un ID temporal?
Resumen de la lección: actualizaciones optimistas manuales
El patrón manual consiste en capturar previousItems, usar setItems con el nuevo estado, realizar la llamada a la API, revertir los cambios si falla mediante setItems(previousItems) y mostrar un error. Para las adiciones, use crypto.randomUUID() como ID temporal y reconcilie el ID con el del servidor cuando la operación tenga éxito. Evite las condiciones de carrera deshabilitando el disparador mientras haya mutaciones en curso. La combinación de reversión, toast y reintento es la experiencia de usuario estándar para los fallos.
Preguntas frecuentes
¿La lección «Implementar actualizaciones optimistas manualmente» es gratis?
Sí — el texto completo de «Implementar actualizaciones optimistas manualmente» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Implementar actualizaciones optimistas manualmente»?
Aplicar el estado optimista localmente, poner en cola la mutación y gestionar explícitamente los casos de éxito y error Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Implementar actualizaciones optimistas manualmente»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Qué es la interfaz optimista y cuándo usarla
- Implementar actualizaciones optimistas manualmente
- Rollback ante errores y resolución de conflictos
- Patrones optimistas con React Query y Zustand