vue의 상태 관리 도구
npm install pinia
vuex 제거도...
main.js
import {createApp} from 'vue';
import App from '@/App.vue';
import {createPinia} from 'pinia';
createApp(App)
.use(createPinia())
.mount('#app');
composition API 방식
sample-store.js
import {defineStore} from 'pinia';
import {ref} from 'vue';
export const useSampleStore = defineStore('unique한 id. 보통 useXxxxStore', () => {
//vuex의 state 요소들에 해당. 반응성을 위해 ref 활용
const count = ref(0);
const name = ref('');
//vuex의 mutations 불필요
//vuex의 getter에 해당. state parameter 불필요
const doubleCount = computed(() => count.value * 2);
//vuex의 action에 해당. commit parameter 불필요(mutations가 없으니까).
const increase = () => count++;
const makeRandomName = async () => await getRandomNameFromSomeApi();
return { count, name, doubleCount, increase, makeRandomName };
});
SampleComponent.vue
<template>
<span>Count : {{sampleStore.count}}</span>
<button @click="sampleStore.increase">increase</button>
</template>
<script setup>
import {useSampleStore} from '@/sample-store.js';
const sampleStore = useSampleStore();
console.log(sampleStore.count); //mutation 호출
sampleStore.increase(); //action 호출
</script>
import {storeToRefs} from 'pinia';
import {useSampleStore} from '@/sample-store.js';
const sampleStore = useSampleStore();
const justCountValue = sampleStore.count; //반응성 없음
const {count} = storeToRefs(sampleStore); //반응성 유지
console.log(justCountValue); //0
console.log(count); //0
//justCountvalue = 10; //error. const 관련
count.value = 10; //vuex의 commit을 통한 mutations 호출부
console.log(count); //10
console.log(sampleStore.count); //10. 반응성 유지 확인