Next.js desde Cero (App Router)

Loading, error y not-found: UX profesional

Estados de UI: loading, error y not-found Una aplicación real nunca está siempre en su estado "feliz": hay esperas, fallos de red y URLs que no existen. El App Router te da archivos especiales para cubrir cada caso sin tener que cablear manualmente la lógica. Cada uno se coloca dentro de la carpeta de la ruta y Next los conecta automáticamente. Los tres archivos clave loading.tsx: se muestra mientras el Server Component asíncrono está cargando. Por debajo, Next lo envuelve en un <Suspense>
Tiempo de estudio
15 Min

Estados de UI: loading, error y not-found


Una aplicación real nunca está siempre en su estado "feliz": hay esperas, fallos de red y URLs que no existen. El App Router te da archivos especiales para cubrir cada caso sin tener que cablear manualmente la lógica. Cada uno se coloca dentro de la carpeta de la ruta y Next los conecta automáticamente.



Los tres archivos clave



  • loading.tsx: se muestra mientras el Server Component asíncrono está cargando. Por debajo, Next lo envuelve en un <Suspense>. Ideal para skeletons.

  • error.tsx: captura errores lanzados durante el render de esa ruta. Debe ser Client Component y recibe error y reset.

  • not-found.tsx: se renderiza cuando llamas a la función notFound() o cuando una URL no coincide con ninguna ruta.



Ejemplo de loading con skeleton


// app/dashboard/loading.tsx
export default function Loading() {
return <div className="skeleton h-40 w-full animate-pulse" />;
}


Ejemplo de error con reintento


// app/dashboard/error.tsx
"use client";

export default function Error({ error, reset }) {
return (
<div>
<p>Algo salió mal: {error.message}</p>
<button onClick={() => reset()}>Reintentar</button>
</div>
);
}


Disparar un 404 desde el código


import { notFound } from "next/navigation";

const curso = await db.curso.findUnique({ where: { slug } });
if (!curso) notFound(); // renderiza not-found.tsx


Nota

error.tsx captura errores de sus rutas hijas, pero no los del layout que está a su mismo nivel. Para cubrir el layout raíz se usa global-error.tsx.



¿Qué archivo se renderiza al llamar a notFound()?

La función notFound() interrumpe el render y muestra el not-found.tsx más cercano en el árbol de rutas.


Ejercicio práctico


Objetivo: dar a una ruta lenta una experiencia profesional de carga y error.

  1. Elige una ruta que cargue datos asíncronos (por ejemplo /dashboard).
  2. Crea loading.tsx con un skeleton animado.
  3. Crea error.tsx (Client Component) con un botón que llame a reset().
  4. Provoca un error a propósito (lanza throw new Error()) y verifica que aparece el fallback y que "Reintentar" recupera la vista.

Entregable: grabación o capturas de los tres estados: cargando, error y recuperado.



Para recordar

  • loading.tsx usa Suspense por debajo; perfecto para skeletons.
  • error.tsx es Client y recibe error y reset.
  • notFound() renderiza el not-found.tsx más cercano.
Texto Leccion 3/12
Estas viendo
Loading, error y not-found: UX profesional
Hablar por WhatsAppContactar por WhatsApp