Dans cette leçon, on apprend à créer une route dynamique et à charger une donnée spécifique côté serveur avec React Router.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Entrez votre email pour débloquer cette leçon gratuite
Dans cette leçon, tu vas apprendre à exploiter la méthode loader de React Router 7 pour récupérer des données dynamiques côté serveur, puis les injecter dans ton composant React. À la fin, tu sauras :
loader
et useLoaderData
pour un rendu SSR performant..server.ts
qui n’est pas packagé côté client.loader
plutôt qu’un fetch client-side ?En React classique, on place souvent un useEffect
avec un fetch pour récupérer des données après le rendu initial. Cette approche :
Avec React Router 7, chaque route peut exporter une fonction loader
qui s’exécute :
<Link>
ou <Form>
).Le résultat retourné par loader
est directement injecté dans ton composant via le hook useLoaderData()
. Le chargement est donc plus fluide, optimisé et sécurisé.
Par convention, on place la logique d’accès aux données dans un fichier suffixé .server.ts
(ou .server.tsx
). Ces fichiers ne sont jamais compilés côté client et contiennent par exemple la connexion à ta base de données ou un appel à un CMS.
1// Simule une base de données en mémoire2const db = {3users: [4{ id: 1, name: 'Virgile' },5{ id: 2, name: 'Robert' },6{ id: 3, name: 'John' },7{ id: 4, name: 'Jack' },8]9}1011// ^? Simulate db delay12export async function getUsers() {13// délai artificiel pour simuler un appel réel14await new Promise(resolve => setTimeout(resolve, 100))15return db.users16}
En production, remplace ce simulateur par un vrai client Prisma, Sequelize, ou un appel REST/GraphQL.
loader
dans la routeMaintenant, passons à notre route users.tsx
. On importe getUsers()
depuis le fichier .server.ts
, puis on exporte une fonction loader
qui récupère la liste des utilisateurs.
1import { useLoaderData } from 'react-router'2import type { LoaderFunctionArgs } from 'react-router'3import { getUsers } from '~/users.server'45export async function loader({}: LoaderFunctionArgs) {6// Exécute la requête serveur avant de rendre le composant7return { users: await getUsers() }8}910export default function UsersRoute() {11const { users } = useLoaderData<typeof loader>()12return (13<div className="px-8 py-4">14<h1 className="text-2xl font-bold">Utilisateurs</h1>15<ul>16{users.map(user => (17<li key={user.id} className="text-lg">18{user.name}19</li>20))}21</ul>22</div>23)24}
loader
retourne un objet { users }
.useLoaderData<typeof loader>()
infère automatiquement le type renvoyé.La fonction loader
s’exécute avant le rendu React, tandis que le composant React sert uniquement à afficher.
Grâce à cette séparation, ton bundle client reste léger : tout ce qui est dans *.server.ts
n’est pas envoyé au navigateur. C’est à la fois une optimisation et une mesure de sécurité (pas de credentials exposés).
1app/2├── routes/3│ └── users.tsx # Composant et loader4└── users.server.ts # Logique server-side
1npm run dev
http://localhost:5173/users
Utilise l’onglet « Network » pour vérifier que la page HTML contient déjà les données.
action
et le composant <Form>
.useCatch()
.users.server.ts
pour exposer getUsers(page: number)
qui slice 2 utilisateurs par page.UsersRoute
pour naviguer entre ?page=1
, ?page=2
, etc.loader
, simule une erreur si page > 3
en lançant throw new Response("Page introuvable", { status: 404 })
.root.tsx
pour afficher un message personnalisé.?search=…
.loader
, filtre db.users
par user.name.includes(search)
.<input>
et un <button>
pour soumettre le formulaire en GET.Bonne exploration et à bientôt pour la suite du module !
Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?