# Zarządzanie stanem
Każdy komponent w Vue zarządza własnym reaktywnym stanem, ale w większych projektach konieczne jest utworzenie stanu, który jest współdzielony przez wiele komponentów. W Vue 3 można zrobić to na kilka sposobów:
TIP
Przeczytaj więcej na temat State Management w oficjalnej dokumentacji (opens new window)
# Pinia
W projektach bazowych używana jest biblioteka Pinia. Każdy moduł posiada katalog stores gdzie można tworzyć nieskończoną ilość store w zależności od potrzeb projektowych.
# Definicja store'a
Store definiuje się za pomocą defineStore(). Funkcja ta przyjmuje jako pierwszy argument unikalną nazwę store'a. Koncepcja w przypadku projektów bazowych jest następująca {module}/{model}. Poniżej przykład w module Core:
modules/core/stores/core.js
import { defineStore } from "pinia";
export const usePermissionStore = defineStore("core/permission", {
state: () => ({
permissions: {
ModuleStructure: null,
},
}),
actions: {
async fetchPermissions() {
const { data } = await this.$api.get("/core/permissions");
this.permissions = data;
return data;
},
},
});
A potem można używać go w komponencie w następujący sposób:
<script setup>
import { usePermissionStore } from "modules/core/stores/core"
const permissionStore = usePermissionStore();
onMounted(() => {
if (!permissionStore.permissions.ModuleStructure) {
permissionStore.fetchPermissions();
}
});
const structure = computed(() => permissionStore.permissions.ModuleStructure);
</script>
# Pluginy
W bibliotece Pinia jest możliwość definiowania pluginów (opens new window). W projektach bazowych pluginy zdefiniowane są w pliku src/stores/plugins.js:
useApi - umożliwia używanie instancji axiosa w store'ach. W przypadku bardziej skomplikowanych aplikacji możliwe jest zdefiniowanie kilku instancji i przekazanie ich w tym pluginie.
useRouter - plugin daje możliwość użycia instancji vue-router'a (opens new window) bezpośrednio w store'ach.
useLoading - ułatwia korzystanie z pluginu Loading (opens new window) w store'ach.
TIP
Czytaj więcej na temat pluginów w bibliotece Pinia.js (Źródło (opens new window))