Chapitre 15 — Appels API (fetch) et données distantes
Au chapitre 14, vous avez appris les bases : BrowserRouter , Routes , Route , Link , paramètres, 404.
Maintenant, on va rendre la navigation “pro” :
un layout (menu + structure commune), des routes imbriquées ,
une route index et l’utilisation de
Plan du chapitre
- 1) Pourquoi un layout ?
- 2) Comprendre <Outlet />
- 3) Routes imbriquées (nested routes)
- 4) Route index (page par défaut)
- 5) Menu “actif” avec NavLink
- 6) Liens relatifs et bonnes pratiques
- 7) Organisation des fichiers (pages / layouts)
- 8) Erreurs fréquentes
- 9) Résumé (à retenir)
- 10) Exercice pratique (débutant)
1) Pourquoi un layout ?
Dans une app, certaines parties restent identiques quelle que soit la page : un menu, un header, un footer, un container, etc. Si vous les dupliquez dans chaque page, vous perdez du temps et vous multipliez les risques d’incohérence.
La solution : un composant Layout qui contient la structure commune,
et une zone qui change en fonction de la route. Cette zone changeante est gérée par <Outlet />.
Objectif : 1 seul menu, 1 seule structure, et les pages s’affichent “à l’intérieur”.
2) Comprendre <Outlet />
<Outlet /> est un emplacement réservé : React Router y affichera le contenu
de la route enfant actuellement active.
Exemple de layout minimal
import { Outlet } from "react-router-dom";
import Navbar from "../components/Navbar.jsx";
export default function MainLayout() {
return (
<div>
<Navbar />
<div style={{ padding: 16 }}>
<Outlet />
</div>
</div>
);
}
Ici, le menu reste fixe, et la page active s’affiche dans l’Outlet.
3) Routes imbriquées (nested routes)
Pour utiliser <Outlet />, il faut déclarer des routes imbriquées :
une route “parent” (le layout), et des routes “enfants” (les pages).
Exemple (dans App.jsx)
import { Routes, Route } from "react-router-dom";
import MainLayout from "./layouts/MainLayout.jsx";
import Home from "./pages/Home.jsx";
import About from "./pages/About.jsx";
import NotFound from "./pages/NotFound.jsx";
export default function App() {
return (
<Routes>
<Route path="/" element={<MainLayout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
);
}
Notez le détail important : quand une route est enfant de path="/",
ses path deviennent relatifs (ex : "about" au lieu de "/about").
4) Route index (page par défaut)
Une route index correspond à la page affichée quand l’URL est exactement celle du parent.
Dans l’exemple précédent :
/→ route parent"/"+ enfantindex→Home/about→ route parent"/"+ enfant"about"→About
Pourquoi c’est utile ?
Parce que vous gardez un layout unique pour tout un “groupe de pages”, avec une page par défaut (index) sans écrire des chemins compliqués.
6) Liens relatifs et bonnes pratiques
Quand vous imbriquez des routes, vous pouvez utiliser des liens absolus (/about)
ou relatifs (ex : depuis /, to="about").
A) Lien absolu (simple à comprendre)
<NavLink to="/about">À propos</NavLink>
B) Lien relatif (pratique dans certains layouts)
<NavLink to="about">À propos</NavLink>
Pour débuter, utilisez surtout des liens absolus : c’est plus clair. Vous passerez aux liens relatifs quand vous serez à l’aise.
7) Organisation des fichiers (pages / layouts)
Voici une structure simple et très utilisée :
src/
├─ App.jsx
├─ main.jsx
├─ components/
│ └─ Navbar.jsx
├─ layouts/
│ └─ MainLayout.jsx
└─ pages/
├─ Home.jsx
├─ About.jsx
└─ NotFound.jsx
pages/: composants “pages” (routés)layouts/: structures communes (avecOutlet)components/: composants UI réutilisables (menu, bouton, etc.)
8) Erreurs fréquentes
Je ne vois jamais ma page enfant (Outlet vide)
Vérifiez que :
(1) votre route parent utilise bien element={<MainLayout />},
(2) que le layout contient bien <Outlet />,
(3) que vous avez bien des routes enfants à l’intérieur du <Route>...</Route> parent.
Mon lien Accueil est toujours “actif”
Sur NavLink vers "/", ajoutez end.
Sinon, / est un préfixe de toutes les URLs.
J’ai écrit path="/about" dans une route enfant et ça ne marche pas comme prévu
Dans des routes imbriquées, privilégiez les chemins relatifs (ex : path="about").
Les chemins absolus peuvent casser la logique de composition avec le layout.
9) Résumé (à retenir)
- Un layout évite de dupliquer menu/structure sur chaque page.
<Outlet />est la “zone” où s’affiche la route enfant active.- Routes imbriquées :
<Route path="/" element={...}> ... </Route>. indexsert de page par défaut du parent.NavLinkpermet de styliser le lien actif ;endest crucial pour"/".
10) Exercice pratique (débutant)
Objectif : construire une mini app avec layout + routes imbriquées.
Étape 1 — Layout
- Créez
src/layouts/MainLayout.jsxavec un menu +<Outlet />. - Créez
src/components/Navbar.jsxavecNavLink.
Étape 2 — Pages
- Créez
Home,About,NotFounddanssrc/pages. - Ajoutez un petit texte différent dans chaque page.
Étape 3 — Routes imbriquées
- Dans
App.jsx, mettezMainLayoutsurpath="/". - Ajoutez une route enfant
indexpourHome. - Ajoutez une route enfant
path="about"pourAbout. - Ajoutez une route
*pour la 404.
Bonus
Ajoutez une page “Contact” et un lien dans le menu. Vérifiez que le lien actif change correctement.
Prochaine étape : Chapitre 16 — Approfondir les formulaires en React (plusieurs champs, validations simples, gestion propre du state).