Tutoriel React — Chapitre 15

Appels API (fetch) et données distantes

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 .

Objectif : comprendre (pas apprendre par cœur) Niveau : débutant absolu Pratique : mini-exercice à la fin

Plan du chapitre

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 "/" + enfant indexHome
  • /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 (avec Outlet)
  • 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>.
  • index sert de page par défaut du parent.
  • NavLink permet de styliser le lien actif ; end est 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.jsx avec un menu + <Outlet />.
  • Créez src/components/Navbar.jsx avec NavLink.

Étape 2 — Pages

  • Créez Home, About, NotFound dans src/pages.
  • Ajoutez un petit texte différent dans chaque page.

Étape 3 — Routes imbriquées

  • Dans App.jsx, mettez MainLayout sur path="/".
  • Ajoutez une route enfant index pour Home.
  • Ajoutez une route enfant path="about" pour About.
  • 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).