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 request
redirect('/users')
)name="_method" value="delete"
action
pour détecter _method === 'delete'
<input>
prérempliid
+ name
au action
db.users
avec la nouvelle valeuraction
throw 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 ?