Imprimer
Catégorie : R3.01 - dev. Web côté client (vuejs)
Affichages : 560

Préambule

  

1°/ Affichage de listes avec v-for.

 

   <p>passed transactions: {{ accountTransactions }}</p>

Exercice :

 Remarque : dans data.js, la date stockée dans le tableau transactions n'est pas directement une chaîne de caractère normalisée, mais telle que stockée dans le BdD, c.a.d. sous la forme d'un objet avec un champ $date, qui lui est normalisé. La vraie date est donc accessible grâce à une expression du type trans.date.$dateDe plus, le format normalisé n'est pas très lisible (par ex : 2023-05-30T17:09:29.199Z) donc il vaut mieux le transformer pour un humain.

Exercice :

Pour ce faire, vous avez plusieurs solutions, la plus "simple" consistant à créer une fonction de transformation dans methods, et de l'appeler dans le template.

 

2°/ Champ de saisie et v-model

A faire dans VirusesView :

 data: () => ({
    priceFilter: 0,
  }),

 

  computed: {
    ...mapState(['viruses']),
    filterVirusesByPrice() {
      if (this.priceFilter >0 ) return this.viruses.filter(v => v.price < this.priceFilter)
      return this.viruses
    }
  }

 

<label for="filterprice">prix inférieur à : </label><input v-model="priceFilter" id="filterprice">
<ul>
  <li v-for="(virus, index) in filterVirusesByPrice" :key="index">{{virus.nom}} : {{virus.price}}</li>
</ul>

  

Exercice 1 :

Exercice 2 :

 Exercice 3 :

 

3°/ Rendu conditionnel avec v-if

A faire dans VirusesView :

<span>Filtres :</span><label for="filterpriceactive">par prix</label><input type="checkbox" v-model="filterPriceActive" id="filterpriceactive">
<hr />
<div v-if="filterPriceActive">
  <label for="filterprice">prix inférieur à : </label><input v-model="priceFilter" id="filterprice">
</div>

Exercice 1 :

Exercice 2 :

 

Rq : il y a un problème fonctionnel avec ces cases à cocher. Si on les décoche et qu'un filtre est en place, les listes apparaissent toujours filtrées, ce qui n'est pas normal

Exercice 3 :

 

 

 

4°/ Pour aller plus loin

 

4.1°/ Filtrage multi-critères

A faire dans VirusesView :

Il existe plusieurs solutions pour résoudre ce problème, plus ou moins efficaces. La plus "simple" consiste à écrire une nouvelle méthode computed qui fait des filtrages successifs, en fonction des filtres actifs.

 

4.2°/ rendre cohérent l'affichage dans BankAccountView

Si l'utilisateur ne tape rien dans le champ de saisie, il peut quand même cliquer sur les boutons et ainsi demander au store de récupérer des informations. D'après le code des services, la réponse va être une erreur. Ce comportement n'est pas désirable et il faudrait invalider les boutons si le champ de saisie est vide.

A faire dans BankAccountView :

 

A faire dans BankAccountView :

Rq : plus besoin de vérifier si le champ est vide 

 

Dans BankAccountView, si l'utilisateur tape un numéro de compte invalide et clique sur un des 2 boutons, il ne se passe rien, à part dans la console. Or, si l'utilisateur avait tapé auparavant un numéro valide, les informations restent affichées, ce qui n'est pas normal.

Pour résoudre ce problème, il faudrait soit afficher les informations du compte (solde ou transactions) si le numéro est bon, soit un message du style "compte invalide" si le numéro n'est pas bon. Malheureusement, l'information comme quoi le numéro est invalide est uniquement connu dans les actions du store, qui récupèrent un objet réponse avec un champ error > 0. La seule façon pour un composant de savoir si son accès à une action du store a provoqué une erreur ou non est donc que le store lui-même stocke un état d'erreur par rapport à la demande.

A faire dans le store :

A faire dans BankAccountView :

Rq : si on clique sur le bouton "Reset", les 2 autres boutons devraient automatiquement être invalidés.

 

Enfin, la route qui permet d'accéder à la age est /bank/amount. Compte tenu de ce qu'elle permet d'afficher, il vadurait mieux utiliser une route /bank/account.

A faire dans le router :