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:

fetch() Tradicional - 47 líneas
// ❌ 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]);
TanStack Query - 7 líneas
// ✅ 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

3s

📦 Estado del Caché

Fresh

Tus datos están actualizados y listos para usar.

👥 Datos

Cargando usuarios...

[Sistema iniciado - Esperando actividad de red...]

🔄 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

5s

⚡ Estado SWR

Stale Data

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

Cache Synced

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:

Escribe tu query de ejemplo:

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.