Vue : construire une application web (école d'ingénieur) · Chapitre 9 · Application directe du cours
Vérifier l'ISBN
Le routeur : plusieurs écrans, une seule page · niveau 2
Énoncé
On veut envoyer vers la page introuvable toute adresse /livres/… dont l'ISBN n'est pas fait de 13 chiffres, sans même interroger le serveur, et en conservant l'adresse tapée.
- Écrire la fonction de vérification, puis l'utiliser comme garde
beforeEnterde la route. - On visite successivement
/livres/abc,/livres/9782956300052et/livres/978-2-95?x=1. Où arrive-t-on à chaque fois ? Expliquer, puis corriger.
Corrigé
// Exercice 9.7 : n'afficher la fiche qu'avec un ISBN de 13 chiffres.
import { createRouter, createMemoryHistory } from "vue-router";
import { routes } from "./routes.js";
function verifierIsbn(to) {
if (to.name !== "livre" || /^\d{13}$/.test(to.params.isbn)) return true;
// On garde l'adresse tapée : la page introuvable l'affichera.
return {
name: "introuvable",
params: { chemin: to.path.slice(1).split("/") },
query: to.query,
hash: to.hash,
};
}
// Première idée : une garde de route (beforeEnter).
export function routeurAvecBeforeEnter() {
return createRouter({
history: createMemoryHistory(),
routes: routes.map((r) => (r.name === "livre" ? { ...r, beforeEnter: verifierIsbn } : r)),
});
}
// Solution : une garde globale, appelée à CHAQUE navigation.
export function routeurAvecBeforeEach() {
const router = createRouter({ history: createMemoryHistory(), routes });
router.beforeEach(verifierIsbn);
return router;
}
Le test fait le même parcours avec les deux routeurs :
beforeEnter : [
'/livres/abc → introuvable',
'/livres/9782956300052 → livre',
'/livres/978-2-95?x=1 → livre'
]
beforeEach : [
'/livres/abc → introuvable',
'/livres/9782956300052 → livre',
'/livres/978-2-95?x=1 → introuvable'
]
- La garde renvoie
trueou une redirection vers la page introuvable, à laquelle on passe les morceaux de l'adresse tapée, la requête et le fragment : l'adresse affichée ne change pas. - Avec
beforeEnter, la troisième adresse arrive sur la fiche : on venait déjà de la fiche du Petit Prince, et la garde de route n'est appelée qu'en entrant dans la route, pas quand seul le paramètre change. La garde globalebeforeEach, appelée à chaque navigation, corrige le problème. On aurait aussi pu ajouter, dans la fiche,onBeforeRouteUpdate(verifierIsbn).
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.