đ Exercice : Exploration de lâApp Router dans Next.js
đ Objectifs
1ïžâŁ CrĂ©er un layout global (layout.tsx
) avec un header et un footer.
2ïžâŁ Ajouter une page about.tsx
pour tester le routing basé sur le systÚme de fichiers.
3ïžâŁ ImplĂ©menter un loading state (loading.tsx
) simulant un chargement asynchrone.
đ Code source : đ GitHubâ đ
1ïžâŁ CrĂ©ation du layout.tsx
(Structure Globale)
đ But : DĂ©finir une structure rĂ©utilisable pour toutes les pages avec un header et un footer.
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="fr">
<body className="flex flex-col min-h-screen">
<header className="bg-blue-600 text-white p-4">
<h1 className="text-xl font-bold">Mon Site Next.js</h1>
</header>
<main className="flex-1 p-4">{children}</main>
<footer className="bg-gray-800 text-white text-center p-4">
© 2025 - Tous droits réservés
</footer>
</body>
</html>
);
}
â Effet : Toutes les pages auront un header et un footer fixes.
2ïžâŁ CrĂ©ation de la page about.tsx
đ But : Observer le fonctionnement du routing basĂ© sur le systĂšme de fichiers (app/about/page.tsx
â /about
).
export default function AboutPage() {
return (
<div>
<h2 className="text-2xl font-bold">Ă propos de nous</h2>
<p>Bienvenue sur notre site Next.js 13+ !</p>
</div>
);
}
â Effet :
- En visitant
http://localhost:3000/about
, la page sâaffiche automatiquement sans besoin de configuration supplĂ©mentaire. - GrĂące au
layout.tsx
, elle inclut le header et le footer sans duplication de code.
3ïžâŁ Ajout dâun loading.tsx
pour simuler un chargement
đ But : Afficher un Ă©cran de chargement lorsquâune page met du temps Ă charger.
export default function Loading() {
return (
<div className="flex flex-col items-center justify-center h-screen">
<p className="text-lg font-semibold">Chargement en cours...</p>
<div className="animate-spin rounded-full border-t-4 border-blue-500 border-solid h-12 w-12"></div>
</div>
);
}
â Effet :
- Si une page prend du temps Ă charger, le
loading.tsx
sâaffiche automatiquement.
4ïžâŁ Test avec une page simulant un dĂ©lai (dashboard/page.tsx
)
đ But : VĂ©rifier que loading.tsx
sâaffiche bien quand une page charge lentement.
async function fetchData() {
await new Promise((resolve) => setTimeout(resolve, 3000)); // Simule un délai de 3s
return { message: "Données chargées avec succÚs !" };
}
export default async function DashboardPage() {
const data = await fetchData();
return (
<div>
<h2 className="text-2xl font-bold">Tableau de bord</h2>
<p>{data.message}</p>
</div>
);
}
â
Effet :
1ïžâŁ Lâutilisateur visite /dashboard
.
2ïžâŁ loading.tsx
sâaffiche pendant 3 secondes.
3ïžâŁ Ensuite, la page /dashboard
se charge avec les données.
đŻ RĂ©sumĂ© des acquis
â CrĂ©ation dâun layout global avec un header et un footer.
â Ajout dâune page dynamique en utilisant le systĂšme de fichiers (app/about/page.tsx
).
â ImplĂ©mentation dâun Ă©tat de chargement (loading.tsx
) pour une meilleure expérience utilisateur.