Exercice 25 - Utilisation de Pinia

Mise en situation

Vous avez compris le pourquoi et la raison d'être de Pinia, maintenant il est temps de le mettre en pratique avec un exercice pratique!

Modalités

À faire (étapes)

Exercice formatif noté.

Étape 0

Étape 1

  1. Faites l'installation de Pinia dans le projet existant
  2. Assurez-vous que main.ts est bien configuré!

Étape 2

  1. Créer un dossier stores avec un store qui sera nommé todo.ts
  2. Faites les importations de vue et de pinia
  3. Faites une interface pour les todos
// Interface pour les objets Todo
interface Todo {
    id: number;
    text: string;
    done: boolean;
}
  1. Dans votre store, faites:
const todos = ref<Todo[]>([]);
// Retour des propriétés du store
  return { ... }
  1. Dans todoList.vue, faite l'utilisation du store pour:
    • Obtenir la liste de todos
    • Inverser la liste de todos sur le clique
    • Ajouter un todo au store
    • Faites les autres modifcations pour utiliser le store (exemple le nombre de tâches)
    • Vous aurez à modifier le template pour que ça fonctionne avec le nouveau type:
      <TodoItem v-for="todo in todos" :key="todo.id" :todo="todo.text" />

NOTE: les autres composants peuvent rester tel quel l'utilisation des emits et des popos est encore valide

Mode Expert : Défi Pinia avancé (environ 30 min)

Défi expert : Vous avez terminé l'exercice? Il est temps de travailler sans filet. Vous avez les concepts, maintenant débrouillez-vous!

Défi 1 : Persistance des données

Problème : Rechargez votre page : toutes vos todos disparaissent. Ce n'est pas acceptable pour une vraie application.

Votre mission : Faites en sorte que les todos survivent au rechargement de page en utilisant le package pinia-plugin-persistedstate.

Validation : Ajoutez 3 todos, rechargez la page (F5), les todos sont encore là.


Défi 2 : Filtrage des todos

Problème : Quand la liste est longue, on veut pouvoir se concentrer sur ce qui reste à faire.

Votre mission : Ajoutez dans l'interface trois boutons Tous / Actifs / Terminés qui filtrent la liste affichée.

Contrainte importante : toute la logique de filtrage doit rester dans le store, pas dans le composant.

Indice : Pensez à un getter computed qui dépend d'un ref représentant le filtre actif.

Validation : Cliquer sur « Actifs » n'affiche que les todos non complétées, « Terminés » n'affiche que celles cochées, « Tous » reaffiche tout.


Défi 3 : Second store

Problème : Un store qui fait trop de choses devient difficile à maintenir. Les statistiques n'ont pas leur place dans todo.ts.

Votre mission : Créez un second store stats.ts qui calcule et expose :

Ce store doit importer et utiliser le store todo : il ne doit pas dupliquer les données.

Affichez ces statistiques dans un nouveau composant StatsPanel.vue intégré dans l'application. Incluez une barre de progression HTML (<progress>) et un message de félicitations lorsque tout est complété.

Validation : Cocher une todo met à jour la barre de progression immédiatement.


Remise