Adloun

Vue : construire une application web (école d'ingénieur) · Chapitre 9 · Exercice de TD

Le numéro de page dans l'adresse

Le routeur : plusieurs écrans, une seule page · niveau 2

Énoncé

Le catalogue grandit : on l'affiche par pages de deux livres. ListePaginee.vue, le composant à écrire, reçoit la liste en prop, lit le numéro de page dans la requête (?page=2) et affiche des liens « Page précédente » et « Page suivante ». Les autres réglages de la requête (q, tri) doivent être conservés ; ?page=abc, ?page=0 ou ?page=99 doivent afficher une page qui existe.

Corrigé


<script setup>
import { computed } from "vue";
import { RouterLink, useRoute } from "vue-router";

const props = defineProps({
  livres: { type: Array, required: true },
  parPage: { type: Number, default: 2 },
});

const route = useRoute();
const nombrePages = computed(() => Math.max(1, Math.ceil(props.livres.length / props.parPage)));

// ?page=2 est une CHAÎNE ; ?page=abc, ?page=0 ou ?page=99 ramènent dans les bornes.
const page = computed(() => {
  const n = Number.parseInt(route.query.page ?? "1", 10);
  if (Number.isNaN(n)) return 1;
  return Math.min(Math.max(n, 1), nombrePages.value);
});

const livresDeLaPage = computed(() =>
  props.livres.slice((page.value - 1) * props.parPage, page.value * props.parPage),
);

// Garde les autres réglages de la requête (recherche, tri…).
const vers = (n) => ({ query: { ...route.query, page: n === 1 ? undefined : n } });
</script>

<template>
  <ul>
    <li
      v-for="livre in livresDeLaPage"
      :key="livre.isbn"
    >
      {{ livre.titre }}
    </li>
  </ul>
  <nav aria-label="Pages">
    <RouterLink
      v-if="page > 1"
      :to="vers(page - 1)"
    >
      Page précédente
    </RouterLink>
    <span>Page {{ page }} sur {{ nombrePages }}</span>
    <RouterLink
      v-if="page < nombrePages"
      :to="vers(page + 1)"
    >
      Page suivante
    </RouterLink>
  </nav>
</template>

Avec cinq livres, le test part de /livres?q=a, clique deux fois sur « Page suivante », puis essaie trois adresses fantaisistes :


/livres?q=a → Java, Algorithmique | Page 1 sur 3 Page suivante
/livres?q=a&page=2 → Analyse, Physique | Page précédente Page 2 sur 3 Page suivante
/livres?q=a&page=3 → Le Petit Prince | Page précédente Page 3 sur 3
/livres?page=abc → Java, Algorithmique | Page 1 sur 3 Page suivante
/livres?page=99 → Le Petit Prince | Page précédente Page 3 sur 3
/livres?page=0 → Java, Algorithmique | Page 1 sur 3 Page suivante

La requête q=a est conservée par les liens, la page 1 est omise de l'adresse, et les valeurs absurdes sont ramenées dans les bornes au lieu de produire une page vide.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →