Next.js desde Cero (App Router)
Texto Leccion
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
erroryreset. - 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.tsxNota
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.
- Elige una ruta que cargue datos asíncronos (por ejemplo
/dashboard). - Crea
loading.tsxcon un skeleton animado. - Crea
error.tsx(Client Component) con un botón que llame areset(). - 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.tsxusa Suspense por debajo; perfecto para skeletons.error.tsxes Client y recibeerroryreset.notFound()renderiza elnot-found.tsxmás cercano.
Texto Lessons
#1
Routing y layouts: estructura clara
#2
Data fetching: cuando cachear y cuando no
#3
Metadata: titles, canonical, OG y Twitter
#4
Landing + CTA: copy y estructura
#5
Server vs Client Components: regla practica
#6
Server Actions: forms sin API extra
#7
Sitemap y robots: indexar lo correcto
#8
Blog: posts, RSS y enlaces internos
#9
Loading, error y not-found: UX profesional
#10
Auth basica: proteger rutas y acciones
#11
Performance: menos JS, mejores Core Web Vitals
#12
Deploy checklist: que mirar antes de lanzar
Ver full lessons
Revisar curso learning pagina