Gestión de Estado del Servidor
Aprende por qué las librerías especializadas revolucionan el manejo de datos asíncronos, eliminando la complejidad de fetch manual y proporcionándote control automático del caché, estados y sincronización.
🔄 Comparación: fetch vs Librerías Especializadas
Ve la diferencia radical en complejidad y funcionalidad:
// ❌ Problemas comunes:
// - Estado manual (loading, error, data)
// - No hay caché automático
// - Refetching manual
// - No hay reintentos automáticos
// - Race conditions posibles
// - Estados inconsistentes
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const fetchUsers = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch('/api/users');
if (!response.ok) {
throw new Error('Error HTTP: ' + response.status);
}
const userData = await response.json();
setData(userData);
} catch (err) {
setError(err.message);
console.error('Error fetching:', err);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchUsers();
}, []);
useEffect(() => {
if (error) {
// Lógica de reintento manual...
const timer = setTimeout(fetchUsers, 5000);
return () => clearTimeout(timer);
}
}, [error]);
// ✅ Ventajas:
// - Estados automáticos (isLoading, error, data)
// - Caché inteligente integrado
// - Refetching automático
// - Reintentos con backoff exponencial
// - Sincronización entre pestañas
// - Optimistic updates
const { data, isLoading, error } = useQuery({
queryKey: ['users'],
queryFn: fetchUsers,
staleTime: 5 * 60 * 1000, // 5 min
retry: 3,
retryDelay: 1000
});
// ¡Eso es todo! No necesitas useEffect,
// useState, ni lógica de reintentos.
⚡ TanStack Query
La librería más popular para gestión de estado del servidor con React. Automatiza completamente el ciclo de vida de tus datos.
Demo 1: Lista de usuarios con caché inteligente
📦 Estado del Caché
Tus datos están actualizados y listos para usar.
👥 Datos
Cargando usuarios...
🔄 SWR - Stale-While-Revalidate
La estrategia "stale-while-revalidate" te muestra datos instantáneamente mientras actualiza en segundo plano.
Demo 2: Vista de datos con actualización en background
⚡ Estado SWR
Mostrando datos en caché mientras revalida...
📊 Métricas en tiempo real
Última actualización: Nunca
Times revalidados: 0
🚀 Apollo Client
Cliente GraphQL con caché normalizada que previene duplicación de datos y sincronización automática.
Demo 3: Formulario con optimistic updates
🎯 Estado Apollo
Datos normalizados en caché local
📋 Usuarios Creados
Lista de usuarios aparecerá aquí...
🎮 Demos Interactivas Completas
Demo 4: Sincronización multi-componente
Dos vistas del mismo dato actualizándose automáticamente:
📋 Vista Lista
Cargando...
👤 Vista Detalle
Cargando...
🤓 Observa: Cuando actualizas un dato en una vista, la otra se actualiza automáticamente gracias a la normalización del caché.
🏆 Editor de Código Interactivo
Modifica el código y observa los resultados en tiempo real:
Los resultados de tu código aparecerán aquí...
💡 Conceptos Clave
🗄️ Servidor como Fuente de Verdad
El cliente no mantiene estado autoritativo, solo una caché sincronizada que se invalida y actualiza automáticamente cuando los datos del servidor cambian.
⚡ Stale-While-Revalidate
Muestra datos instantáneamente (stale) mientras los actualiza en segundo plano (revalidate), mejorando la percepción de velocidad.
🔄 Sincronización Automática
Cuando los datos se actualizan en un lugar, todos los componentes que usan esos datos se actualizan automáticamente sin código adicional.
🎯 Optimistic Updates
Actualiza la UI inmediatamente mientras envía la petición al servidor. Si falla, hace rollback automáticamente.