Skip to main content

Le Routing en React - Cours n°2

Routes Statiques et Imbriquées​

Les Routes Imbriquées : Une Histoire de Poupées Russes 🪆​

Imaginez votre application comme une grande maison. Jusqu'à présent, on avait juste différentes pièces (routes) au rez-de-chaussée. Mais que faire si on veut des pièces dans des pièces ? C'est là qu'interviennent les routes imbriquées !

// src/pages/Dashboard.jsx
import { Outlet } from 'react-router-dom'

export default function Dashboard() {
return (
<div className="dashboard">
<h1>Dashboard</h1>
<nav>
<Link to="/dashboard/profile">Mon Profil</Link>
<Link to="/dashboard/settings">Paramètres</Link>
</nav>
{/* Outlet est comme une fenêtre qui montre le contenu des routes enfants */}
<Outlet />
</div>
)
}

// src/pages/dashboard/Profile.jsx
export default function Profile() {
return <div>Mon super profil !</div>
}

// src/pages/dashboard/Settings.jsx
export default function Settings() {
return <div>Mes paramètres préférés</div>
}

// src/App.jsx
function App() {
return (
<>
<Navbar />
<Routes>
<Route path="/" element={<Home />} />
{/* Route parent */}
<Route path="/dashboard" element={<Dashboard />}>
{/* Routes enfants */}
<Route path="profile" element={<Profile />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
</>
)
}

Layout Partagé : Ne Vous Répétez Pas !​

Un layout, c'est comme un template qui enveloppe vos pages. Créons un layout général :

// src/components/MainLayout.jsx
import { Outlet } from 'react-router-dom'
import Navbar from './Navbar'
import Footer from './Footer'

export default function MainLayout() {
return (
<div className="main-layout">
<Navbar />
<main>
<Outlet />
</main>
<Footer />
</div>
)
}

// src/App.jsx mise à jour
function App() {
return (
<Routes>
<Route element={<MainLayout />}>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/dashboard" element={<Dashboard />}>
<Route path="profile" element={<Profile />} />
<Route path="settings" element={<Settings />} />
</Route>
</Route>
</Routes>
)
}

Jour 3-4 : Navigation Comme Un Pro 🎮​

// src/components/SuperNavbar.jsx
import { NavLink, useLocation } from 'react-router-dom'

export default function SuperNavbar() {
const location = useLocation() // Donne des infos sur l'URL actuelle

return (
<nav>
<NavLink
to="/"
className={({ isActive }) =>
`nav-link ${isActive ? 'active' : ''}`
}
>
Accueil
</NavLink>

{/* Regardez cette beauté ! Un menu déroulant qui sait où il est */}
<div className="dropdown">
<NavLink
to="/dashboard"
className={({ isActive }) =>
`nav-link ${isActive || location.pathname.startsWith('/dashboard/')
? 'active'
: ''
}`
}
>
Dashboard
</NavLink>
</div>
</nav>
)
}

Parfois, on veut naviguer après une action (comme un clic sur un bouton ou après avoir soumis un formulaire) :

// src/components/LoginForm.jsx
import { useNavigate } from 'react-router-dom'

export default function LoginForm() {
const navigate = useNavigate()

const handleSubmit = (e) => {
e.preventDefault()
// Imaginons qu'on vérifie le login ici...

// Puis on redirige vers le dashboard
navigate('/dashboard', {
state: { message: 'Bienvenue !' },
replace: true // Remplace l'entrée dans l'historique
})
}

return (
<form onSubmit={handleSubmit}>
<input type="email" placeholder="Email" />
<input type="password" placeholder="Mot de passe" />
<button type="submit">Connexion</button>

{/* Bouton retour */}
<button
type="button"
onClick={() => navigate(-1)}
>
Retour
</button>
</form>
)
}

Le Petit Plus : Navigation avec Animation ! ✨​

// src/components/AnimatedRoutes.jsx
import { AnimatePresence, motion } from 'framer-motion'
import { Routes, Route, useLocation } from 'react-router-dom'

export default function AnimatedRoutes() {
const location = useLocation()

return (
<AnimatePresence mode="wait">
<motion.div
key={location.pathname}
initial={{ opacity: 0, x: 20 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -20 }}
>
<Routes location={location}>
{/* vos routes ici */}
</Routes>
</motion.div>
</AnimatePresence>
)
}

Exercice : Créez un Mini-Portfolio !​

Créez un portfolio avec :

  1. Une page d'accueil présentant vos projets
  2. Une section "Projets" avec des sous-routes pour chaque projet
  3. Une navigation élégante avec des animations
  4. Un formulaire de contact qui redirige vers une page de remerciement après envoi

Bonus : Ajoutez une barre de progression en haut de la page qui indique où vous êtes dans la navigation !

Astuce Pro 🎯​

  • Utilisez useLocation pour des effets basés sur la route actuelle
  • Le prop replace de navigate est super utile pour les formulaires
  • NavLink peut recevoir une fonction comme className ou style
  • Outlet peut recevoir un context pour passer des données aux routes enfants

Pour le cours Prochain...​

On va plonger dans les paramètres d'URL et les routes dynamiques. Vous allez voir, c'est comme donner des super-pouvoirs à vos routes ! 🦸‍♂️