Explica cómo useTransition y useDeferredValue separan actualizaciones urgentes y no urgentes para mantener interacciones fluidas durante renderizados costosos.
Una transición prioriza renderizado. No establece un tiempo fijo ni reduce necesariamente peticiones de red. Para eso puede seguir siendo necesario debounce o cancelación.
Los setters llamados sincrónicamente dentro de startTransition se marcan como no urgentes. Si haces await, los setters posteriores pueden necesitar otro startTransition según la versión y el flujo:
TypeScript
startTransition(async()=>{const data =awaitloadData();startTransition(()=>{setData(data);});});
Documenta el comportamiento de la versión objetivo y evita depender de detalles no verificados.
debounce
→ espera un tiempo
→ puede evitar requests o cálculos
transition/deferred
→ inicia o permite trabajo
→ cambia su prioridad
→ no garantiza menos requests
Una actualización urgente que suspende puede reemplazar contenido visible por fallback. Una transition permite conservar la pantalla anterior mientras se prepara la siguiente:
TypeScript
startTransition(()=>{setRoute(nextRoute);});
isPending puede atenuar navegación o mostrar progreso sin borrar contexto.
Transitions también coordinan Actions y mutaciones en React moderno. isPending representa trabajo pendiente dentro de la transición, pero la consistencia de datos, errores e idempotencia siguen perteneciendo al flujo completo.
Varias transitions pueden solaparse. No asumas que cada isPending identifica una operación individual. Si necesitas distinguir uploads o filas concretas, modela identidad de operación además del estado global de transición.
Si renderizar una lista tarda varios segundos, transition puede mantener el input responsivo, pero el trabajo sigue consumiendo CPU. Reduce datos, virtualiza, optimiza algoritmos o mueve cálculo fuera del main thread.