React Router - Navigation dans vos SPAs

Salut ! Maintenant qu'on maîtrise les composants et les hooks, on va s'attaquer à la navigation dans nos applications React.

Quand ton app grandit, tu vas vouloir avoir plusieurs "pages" avec des URLs différentes. C'est là qu'intervient React Router !


Qu'est-ce que le routing ?

Le problème des SPAs

Dans une Single Page Application (SPA), techniquement on n'a qu'une seule page HTML. Mais on veut quand même :

  • Des URLs différentes pour chaque "page" (/home, /about, /profile)
  • Le bouton "Précédent" du navigateur qui marche
  • Pouvoir partager des liens
  • Un bon SEO

React Router à la rescousse

React Router va nous permettre de :

  • Associer des composants à des URLs
  • Naviguer entre les pages sans rechargement
  • Gérer l'historique du navigateur
  • Passer des paramètres dans les URLs

Installation de React Router

npm install react-router-dom

C'est tout ! React Router DOM est la version pour le web (il y a aussi React Router Native pour React Native).


Configuration de base

1. Wrapper votre app avec BrowserRouter

Dans votre main.jsx :

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom'
import './index.css'
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>,
)

2. Définir les routes dans App.jsx

import { Routes, Route } from 'react-router-dom'
import Home from './pages/Home'
import About from './pages/About'
import Contact from './pages/Contact'
import NotFound from './pages/NotFound'

function App() {
  return (
    <div>
      <nav>
        <a href="/">Home</a>
        <a href="/about">About</a>
        <a href="/contact">Contact</a>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </div>
  )
}

export default App

3. Créer vos composants pages

// src/pages/Home.jsx
function Home() {
  return (
    <div>
      <h1>🏠 Accueil</h1>
      <p>Bienvenue sur la page d'accueil !</p>
    </div>
  )
}

export default Home

// src/pages/About.jsx
function About() {
  return (
    <div>
      <h1>📖 À propos</h1>
      <p>Voici notre histoire...</p>
    </div>
  )
}

export default About

Le problème avec <a href="">

Si vous utilisez des liens HTML classiques, toute la page se recharge à chaque clic. On perd tous les avantages d'une SPA !

import { Link } from 'react-router-dom'

function Navigation() {
  return (
    <nav>
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
      <Link to="/contact">Contact</Link>
    </nav>
  )
}

NavLink permet de styliser le lien de la page courante :

import { NavLink } from 'react-router-dom'

function Navigation() {
  return (
    <nav>
      <NavLink
        to="/"
        className={({ isActive }) => isActive ? 'active-link' : ''}
      >
        Home
      </NavLink>
      <NavLink
        to="/about"
        className={({ isActive }) => isActive ? 'active-link' : ''}
      >
        About
      </NavLink>
    </nav>
  )
}

Next.js App Router (pour les projets Next.js)

// app/page.js (Next.js 13+)
export default function HomePage() {
  return <h1>Page d'accueil</h1>
}

// app/blog/page.js
export default function BlogPage() {
  return <h1>Blog</h1>
}

// Navigation en Next.js
import Link from 'next/link'

function Navigation() {
  return (
    <nav>
      <Link href="/">Accueil</Link>
      <Link href="/blog">Blog</Link>
    </nav>
  )
}

Ressources pour aller plus loin