Créer un store avec Vue 3, Pinia et TypeScript

La gestion d’état vous permet d’exécuter une application plus rapidement. Pinia a remplacé Vuex dans les applications Vue. Avec Pinia, il est temps d’adopter l’API de composition, même au sein des gestionnaires d’état.

Jérémie Litzler
2 min readApr 17, 2024
VueSchool.io pour l’image.

Pinia est l’extension de gestion d’état recommandé pour les applications Vue.

Bien que vous puissiez l’utiliser avec la méthode « Option API », si vous utilisez TypeScript, optez pour la méthode « Composition API ».

Oui, même au sein des magasins d’états, vous pouvez utiliser le modèle setup.

Avec JavaScript, vous auriez, par exemple :

import { ref } from 'vue' ;
import { defineStore } from 'pinia' ;
import useSampleData de '@/composables/useSampleData' ;

const { categoriesData } = useSampleData() ;
export const useCategoryStore = defineStore('CategoryStore', {
state : {
categories = ref(categoriesData) ;
},
getters : {
getCategoryById = (categoryId) => {
const match = this.categories.value.find(
(category : Category) => category.id === categoryId
) ;
if (match === undefined) return {} ;
return match ;
}
}
}) ;

Avec TypeScript, cela devient :

import { ref } from "vue" ;
import { defineStore } from "pinia" ;
import useSampleData de "@/composables/useSampleData" ;
import type Category from "@/types/Category" ;

const { categoriesData } = useSampleData() ;

export const useCategoryStore = defineStore("CategoryStore", () => {
//ÉTAT
const categories = ref(categoriesData) ;
//GETTERS
const getCategoryById = (categoryId : string | undefined) : Catégorie => {
const match = categories.value.find(
(category : Category) => category.id === categoryId
) ;
if (match === undefined) return {} ;
return match ;
} ;
return { categories, getCategoryById } ;
}) ;

La fonction fléchée que vous voyez après le nom du magasin utilise la définition de la fonction avec le modèle de configuration.

Remerciements à cette discussion sur GitHub pour m’avoir aidé à comprendre la technique.

--

--

Jérémie Litzler

I am a software engineer, but not just that: I thrive to improve life around me through observation and awareness about my impact in my environment.