17. projet [vuejs-15] : utilisation du plugin [Vuex]
Le projet [vuejs-15] reprend le projet [vuejs-14] en utilisant un objet [session] réactif généré par [Vuex]. L’aborescence du projet est la suivante :

17.1. Installation de la dépendance [vuex]

17.2. Le script [./session.js]
L’objet [session] devient le suivant :
Commentaires
- lignes 2-4 : on intègre le plugin [Vuex] au framework [Vue] ;
- ligne 7 : la session devient un objet de type [Vuex.Store] ;
- lignes 8-11 : la propriété [state] contient l’état partagé de l’application [Vue]. Cette propriété sera accessible à tous les composants de l’application. Ici nous partageons le tableau des simulations [lignes] (ligne 10) ;
- lignes 12-35 : la propriété [mutations] rassemble les méthodes qui modifie le contenu de l’objet [state] ;
- lignes 14-26 : la propriété [generateLignes] est une fonction générant une valeur initiale pour la propriété [state.lignes]. Elle admet ici [state] comme paramètre. Lignes 18-23 : la propriété [state.lignes] est initialisée ;
- lignes 28-35 : la propriété [deleteLigne] est une fonction supprimant une ligne du tableau [state.lignes]. Elle a pour paramètres :
- [state] qui représente l’objet des lignes 8-11 ;
- [index] qui est le n° de la ligne à supprimer ;
- les fonctions de la propriété [mutations] admettent toujours comme 1er paramètre, un objet représentant la propriété [state] de la ligne 8. Les paramètres suivants sont fournis par le code appelant la mutation ;
- ligne 37 : l’objet [session] est exporté.
Contrairement au projet précédent [vuejs-13] nous n’aurons pas ici de plugin pour rendre la session accessible aux composants dans un attribut [Vue.$session].
17.3. Le script principal [./main.js]
Le script principal évolue de la façon suivante :
Commentaires
- ligne 14 : la session est importée ;
- ligne 23 : elle est passée à la vue principale dans un attribut nommé [store] (c’est imposé). Grâce au plugin [Vuex], cet attribut devient alors disponible à tous les composants dans un attribut [Vue.$store]. On est donc dans une configuration très proche de celle du projet précédent : là où dans un composant on accédait à la session via la notation [this.$session], on y accèdera maintenant via la notation [this.$store] ;
17.4. La vue principale [App]
La vue principale [App] évolue comme suit :
Commentaires
- ligne 9 : la vue [App] utilise le composant [Table] mais ne reçoit plus d’événements de sa part, ceci grâce au fait que le store [Vuex] est réactif ;
- lignes 24-27 : la méthode [created] est exécutée juste après la création du composant [App]. Dans celle-ci, on exécute la mutation nommée [generateLignes] qui génère une valeur initiale pour le tableau des simulations. On notera la syntaxe particulière de l’instruction. On rappelle que la notation [this.$store] fait référence à la propriété [store] de la vue instanciée dans [main.js] :
La notation [this.$store] désigne donc l’objet [session]. On écrit ensuite [this.$store.commit("generateLignes")] pour exécuter la mutation s’appelant [generateLignes]. Cette mutation est une fonction ;
17.5. Le composant [Table]
Le composant [Table] évolue de la façon suivante :
Commentaires
- le [template] des lignes 1-24 ne change pas ;
- lignes 30-32 : la propriété calculée [lignes] utilise désormais le [store] de [Vuex] ;
- lignes 49-54 : pour supprimer une ligne de la table HTML, on utilise la mutation [deleteLigne] du [store] de [Vuex]. On passe en paramètre le n° [index] de la ligne à supprimer (ligne 53) ;
- lignes 56-61 : pour recharger la table HTML avec une nouvelle liste, on utilise la mutation [generateLignes] du [store] de [Vuex] ;
17.6. Conclusion
Les attributs [Vue.$session] du projet [vuejs-13] et [Vue.$store] du projet [vuejs-15] sont très proches l’un de l’autre. Ils visent le même objectif : partager de l’information entre vues. L’avantage de l’objet [store] est d’être réactif alors que l’objet [session] ne l’est pas. Mais le projet [vuejs-14] a montré qu’il était aisé de rendre réactif l’objet [session] en le dupliquant dans les propriétés réactives des vues.