Apprends à modifier des données côté serveur avec React Router 7 et la méthode action : ajout, édition, suppression d’utilisateurs, et protection des données sensibles.
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, on va apprendre à modifier des données — ajouter, éditer ou supprimer un utilisateur — côté serveur avec React Router 7. On verra comment :
action pour recevoir et traiter un formulaire en POSTUne mutation est une opération qui modifie l’état de ton application ou de ta base de données. Par opposition au loader (qui ne lit que des données), l’action va :
Comme on touche à la source de vérité (la DB), ce traitement doit absolument se faire côté serveur pour :
Le loader sert à charger des données (GET).
L’action sert à traiter des mutations (POST, PUT, DELETE, etc.).
action dans ta routeDans React Router 7, on ajoute simplement une fonction action exportée depuis le même fichier que le loader. Exemple minimal :
1import { Form, useLoaderData, type ActionFunctionArgs }2from 'react-router';3import { getUsers, addUser } from '~/users.server';45export async function loader() {6return { users: await getUsers() };7}89export async function action({ request }: ActionFunctionArgs) {10// 1. lire le payload du formulaire11const formData = await request.formData() // ^? FormData API12// 2. extraire la donnée13const name = formData.get('name') as string14// @callout: formData.get peut retourner null si le champ n'existe pas15// 3. modifier la DB16await addUser({ name })17// 4. renvoyer un signe de succès18return { ok: true }19}2021export default function Users() {22const { users } = useLoaderData<typeof loader>()23return (24<>25{/* liste des utilisateurs */}26{/* ... */}27<Form method="POST">28<input name="name" placeholder="Nom d’utilisateur" />29<button type="submit">Ajouter</button>30</Form>31</>32)33}
Form et method="POST" ?<form> HTML utilise la méthode GET ⇒ déclenche le loader.method="POST", React Router appelle d’abord ton action puis relance le loader pour mettre à jour l’UI.<Form> de React RouterReact Router fournit un <Form> amélioré :
1<Form method="POST" className="flex gap-2">2<input3type="text"4name="name"5className="border px-2"6placeholder="Nom d'utilisateur"7/>8<button type="submit" className="bg-blue-600 text-white px-4">9Ajouter un utilisateur10</button>11</Form>
Tu peux aussi utiliser <Form replace> pour remplacer l’historique après l’action.
Pour cet exemple, on simule une DB en mémoire dans app/users.server.ts :
1const db = {2users: [3{ id: 1, name: 'Virgile' },4{ id: 2, name: 'Robert' },5]6}78export async function getUsers() {9await new Promise(r => setTimeout(r, 100))10return db.users11}1213export async function addUser({ name }: { name: string }) {14const newUser = { id: db.users.length + 1, name }15db.users.push(newUser)16return newUser17}
Attention : à chaque redémarrage du serveur, la mémoire est réinitialisée !
Pour la prod, migre vers une vraie base de données (PostgreSQL, MongoDB, …).
loader() readaction() writeloader() read1flowchart LR2load[Page load] -->|GET| loader3loader --> UI[Render UI]4UI -->|POST form| action5action --> loader6loader --> UI
C’est le principe du full-stack data avec React Router.
export async function action dans ta route<Form method="POST"> déclenche l’actionformData depuis requestredirect('/users'))name="_method" value="delete"action pour détecter _method === 'delete'<input> prérempliid + name au actiondb.users avec la nouvelle valeuractionthrow new Response("Forbidden", { status: 403 })ErrorBoundary↩︎ Pour approfondir la gestion des formulaires et de la validation, consulte le module Formulaires avancés.
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 ?