useOptimistic es un hook de React 19 que permite mostrar un estado temporal en la UI mientras una operación asíncrona está en curso.
La idea es sencilla: actúa como si la operación ya hubiera tenido éxito, y cuando el servidor responde, se reconcilia con el estado real.
import { useOptimistic, useState } from 'react';
function TodoList({ todos, addTodo }) {
const [optimisticTodos, addOptimisticTodo] = useOptimistic(
todos,
(currentTodos, newTodo) => [...currentTodos, { ...newTodo, pending: true }]
);
const handleSubmit = async (formData) => {
const newTodo = { text: formData.get('text'), id: Date.now() };
addOptimisticTodo(newTodo); // actualiza UI al instante
await addTodo(newTodo); // petición real al servidor
};
return (
<ul>
{optimisticTodos.map(todo => (
<li key={todo.id} style={{ opacity: todo.pending ? 0.5 : 1 }}>
{todo.text}
</li>
))}
</ul>
);
}
El nuevo elemento aparece inmediatamente en la lista con opacity: 0.5. Cuando addTodo resuelve, React sustituye el estado optimista por el real.
Si la promesa rechaza, React revierte automáticamente al estado anterior. No necesitas gestionar el rollback manualmente.
try {
await addTodo(newTodo);
} catch {
// useOptimistic ya revirtió el estado por ti
showError('No se pudo añadir la tarea');
}
useOptimistic hace que las apps se sientan instantáneas sin sacrificar la consistencia de datos. Es la forma que React 19 propone para implementar optimistic UI sin librerías externas.

React 19 convierte ref en una prop normal. Ya no necesitas envolver tus componentes con forwardRef para pasar referencias a elementos hijos.

React 19 introduce use(), un nuevo primitivo que permite leer promesas y contextos directamente durante el render. Adiós a useEffect para cargar datos.