Adloun

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

Les livres consultés

Pinia : un état partagé par toute l'application · niveau 3 (difficile)

Énoncé

On veut afficher sur le catalogue les trois derniers livres consultés, du plus récent au plus ancien, sans doublon. Écrire un store historique, une garde afterEach qui y note l'ISBN de chaque fiche visitée, et un composant DejaConsultes.vue qui affiche les titres en liens. Après la visite des fiches de Java, du Petit Prince, de Java, de L'Étranger puis d'Analyse MPSI, qu'affiche-t-il ?

Corrigé


import { ref } from "vue";
import { defineStore } from "pinia";

/** Les trois derniers livres consultés, du plus récent au plus ancien. */
export const useHistoriqueStore = defineStore("historique", () => {
  const isbns = ref([]);

  function noter(isbn) {
    isbns.value = [isbn, ...isbns.value.filter((i) => i !== isbn)].slice(0, 3);
  }

  return { isbns, noter };
});

// Après chaque visite d'une fiche, l'ISBN rejoint l'historique.
router.afterEach((to) => {
  if (to.name === "livre") useHistoriqueStore().noter(to.params.isbn);
});

<script setup>
import { computed } from "vue";
import { RouterLink } from "vue-router";
import { useHistoriqueStore } from "./historique.js";

const props = defineProps({
  livres: { type: Array, required: true }, // le catalogue
});

const historique = useHistoriqueStore();
const consultes = computed(() =>
  historique.isbns
    .map((isbn) => props.livres.find((l) => l.isbn === isbn))
    .filter(Boolean), // un ISBN inconnu du catalogue est ignoré
);
</script>

<template>
  <section
    v-if="consultes.length > 0"
    aria-labelledby="titre-consultes"
  >
    <h2 id="titre-consultes">
      Vous avez consulté
    </h2>
    <ul>
      <li
        v-for="livre in consultes"
        :key="livre.isbn"
      >
        <RouterLink :to="{ name: 'livre', params: { isbn: livre.isbn } }">
          {{ livre.titre }}
        </RouterLink>
      </li>
    </ul>
  </section>
</template>

Java, Prince, Java, Étranger, Analyse → [ 'Analyse MPSI', 'L’Étranger', 'Programmation Java' ]

Le second passage sur Java le remonte en tête au lieu de le dupliquer, et le Petit Prince, le plus ancien, sort de la liste. Le store ne garde que des ISBN : les titres viennent du catalogue, qui fait foi (prix et titres à jour). Pour garder l'historique d'une visite à l'autre, il suffirait de remplacer la ref par useStockage.

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 →