<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>React Router avancé :: projet développement d'application web</title><link>https://cegepmv.github.io/420-412/11-react-router/index.html</link><description>Cette section a pour objectif de transformer votre manière de concevoir une application React en créant une connexion fluide et robuste entre votre interface et votre API NestJS.
Nous allons partir des fondements acquis dans le cours 420-211 - Applications Web pour pousser les concepts un peu plus loin.
Pour mettre cela en pratique, nous allons travailler sur une application concrète. Nous utiliserons un projet frontend de départ contenant des données “en dur”(mock data) ainsi qu’un backend déjà fonctionnel :</description><generator>Hugo</generator><language>fr-fr</language><atom:link href="https://cegepmv.github.io/420-412/11-react-router/index.xml" rel="self" type="application/rss+xml"/><item><title>Routes et layouts</title><link>https://cegepmv.github.io/420-412/11-react-router/1-layout-outlet/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/1-layout-outlet/index.html</guid><description>Dans le code actuel, chaque page est indépendante. Si vous regardez le composant &lt;App />, vous remarquez que le &lt;Header /> et le &lt;Footer /> sont “codés en dur” autour des routes. C’est fonctionnel, mais pas idéal.
Route Parente (Layout) L’idée est de traiter une route non pas comme une simple page, mais comme une enveloppe. Un Layout est un composant qui définit la structure commune (ex: Barre de navigation, Sidebar, Footer) et laisse un espace vide pour le contenu spécifique à la page.</description></item><item><title>Récupération de données (loaders)</title><link>https://cegepmv.github.io/420-412/11-react-router/2-requetes-lecture/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/2-requetes-lecture/index.html</guid><description>Dans cette section, nous allons voir comment récupérer des données (requête GET) de notre backend et les afficher dans notre frontend.
Création d’un service API La première étape est d’implémenter les fonctions fetch qui nous permettront de faire les requêtes nécessaires aux backend pour récupérer les données.
Plutôt que d’écrire des fetch éparpillés partout, une bonne pratique est de créer un service d’API qui contient toutes les fonctions.
Contenu du fichier /services/api.js :</description></item><item><title>Envoi de données (actions)</title><link>https://cegepmv.github.io/420-412/11-react-router/3-requetes-ecriture/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/3-requetes-ecriture/index.html</guid><description>Alors que les Loaders servent à récupérer des données (GET), les Actions servent à en envoyer (POST, PUT, DELETE). C’est la méthode “moderne” de gérer les formulaires sans useState.
Formulaire de connexion 1. Créer la fonction loginAction Cette fonction traite les données du formulaire et communique avec le backend.
// actions/login.action.js import { redirect } from "react-router-dom"; import { loginUser } from "/src/services/api"; export async function loginAction({ request }) { // 1. On extrait les données du formulaire envoyé par le composant &lt;Form> const formData = await request.formData(); const creds = { email: formData.get('email'), // Récupère la valeur de l'input name="email" password: formData.get('password'), // Récupère la valeur de l'input name="password" }; try { // 3. Appel au service API (NestJS) await loginUser(creds) // 4. Succès : On redirige l'utilisateur vers son dashboard return redirect("/host") } catch (error) { // 5. Échec : On "return" un message d'erreur au lieu de le "throw" // Ce message sera récupéré par le composant via useActionData() if (error.status === 404 || error.status === 400) { return "Email or password is incorrect. Please try again." } return "Login failed. Please try again." } }; 2. Déclarer l’Action dans les Routes Pour que React Router sache quelle action exécuter lors de l’envoi du formulaire, on la branche sur la route correspondante (comme pour les loaders).</description></item><item><title>Routes protégées</title><link>https://cegepmv.github.io/420-412/11-react-router/4-pages-protegees/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/4-pages-protegees/index.html</guid><description>Dans certaines cas, on voudrait que certaines pages de notre application ne puissent être accessible qu’à un utilisateur connecté (par exemple la page Dashboard). Avec React en Data Mode, on peut tout à fait le faire en mettant en place un “garde” (Guard) qui s’exécute au niveau du loader avant d’afficher la page.
Fonction utilitaire requireAuth Cette fonction est un middleware côté client : elle vérifie si l’utilisateur est connecté et, sinon, le redirige intelligemment.</description></item><item><title>Expérience utilisateur (UX)</title><link>https://cegepmv.github.io/420-412/11-react-router/5-ux-et-params/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/5-ux-et-params/index.html</guid><description>Dans cette section, nous allons voir comment améliorer l’expérience utilisateur, d’abord en utilisant des Query String (ce qui se trouve après le ? dans l’URL) pour faire circuler des informations entre deux pages, puis en explorant le composant &lt;NavLink> de React Router.
Utilité Imaginez ce scénario :
L’utilisateur navigue directement sur son Dashboard. Votre code détecte qu’il n’est pas connecté. Vous le redirigez vers /login. Problème : Une fois connecté, il atterrit sur l’accueil. Il a perdu sa destination initiale. La solution : “Transporter” l’intention de l’utilisateur dans l’URL. 1 - Envoyer les infos (requireAuth) On modifie notre garde pour qu’il construise une URL de redirection “enrichie”.</description></item><item><title>Pour aller plus loin</title><link>https://cegepmv.github.io/420-412/11-react-router/6-aller-plus-loin/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cegepmv.github.io/420-412/11-react-router/6-aller-plus-loin/index.html</guid><description>Gestion des états de chargement et des erreurs Dans une application classique, si une API plante, l’écran devient souvent blanc ou reste bloqué. Avec React Router, on peut définir des “filets de sécurité” à différents niveaux de l’arborescence.
Le HydrateFallback (chargement initial) Lorsque l’utilisateur arrive sur l’application pour la première fois et que le premier loader prend du temps, le HydrateFallback permet d’afficher un indicateur de chargement global pendant que l’application “s’hydrate” (se charge en mémoire).</description></item></channel></rss>