Apprends à rediriger l’utilisateur vers la page initiale après login dans React Router 7 pour une expérience fluide et sans perte de contexte.
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é
Tu viens de protéger tes routes avec requireUser()
.
💡 Problème : si un visiteur non connecté tape /profile
, il est envoyé sur
/login
… et, une fois authentifié, il atterrit sur la home !
Pas terrible : on veut revenir sur la page initialement demandée.
Nous allons :
/login
.action
du formulaire pour refaire la bonne redirection.Objectif UX : aucune perte de contexte, même après expiration de cookie ou connexion obligatoire sur une page « admin ».
requireUser
1export async function requireUser({ request }: { request: Request }) {2const user = await getOptionalUser({ request })3if (user) return user // déjà connecté45const url = new URL(request.url) // ① parse l’URL6const pathname = url.pathname // ② ex: "/profile"78// ③ on ajoute le paramètre redirectTo9throw redirect(`/login?redirectTo=${pathname}`)10}
Points clés :
new URL(request.url)
te donne l’objet complet (host, query, pathname…).pathname
(pas la query) ; c’est ce qu’on
souhaite rejouer après le login.redirectTo
dans l’action de /login
1import {2commitSession,3getUserSession,4} from "~/server/sessions.server"56export async function action({ request }: ActionFunctionArgs) {7const session = await getUserSession({ request })89/* ici : vérifie email + password → ok */1011session.set("userId", "10") // user connecté1213// ① on relit l’URL d’origine14const url = new URL(request.url)15const search = url.searchParams16const redirectTo = search.get("redirectTo") || "/"1718// ② on renvoie le cookie ET la redirection appropriée19return redirect(redirectTo, {20headers: {21"Set-Cookie": await commitSession(session),22},23})24}
Si aucun paramètre n’est présent, on retombe sur la page d’accueil par
défaut : || "/"
.
1# 1. Visiteur non connecté2GET /profile → requireUser() ⟶ 302 /login?redirectTo=/profile34# 2. Formulaire POST /login5POST /login → action() ⟶ 302 /profile + Set-Cookie
✅ L’utilisateur est arrivé exactement là où il voulait aller, sans double clic ni Home surprise.
Tu pourrais écrire session.set("redirectTo", pathname)
…
mais :
Règle d’or : garde la session pour le qui (userId, tokens) et l’URL pour le où (chemin cible).
Dans root.tsx
, tu charges déjà user
; ajoute un hook pour lire le paramètre
redirectTo
(pratique pour afficher un message « Connecte-toi pour accéder à
/courses »).
1export function useRedirectAfterLogin() {2const location = useLocation()3const params = new URLSearchParams(location.search)4return params.get("redirectTo") ?? "/"5}
Étape | Code | Rôle |
---|---|---|
1 | requireUser() | Ajoute ?redirectTo= + pathname |
2 | action() de /login | Lit ce paramède, fallback “/” |
3 | redirect() | Envoie l’utilisateur sur la page voulue |
Le tout en ≈ 15 lignes, 100 % server-side, zéro JS côté client.
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 ?