npm install pinia
// main.js파일
import { createApp } from 'vue'
import { createPinia } from 'pinia'
const app = createApp(App)
app.use(createPinia())
app.mount('#app')

import { defineStore } from 'pinia'
// 다른 컴포넌트에서 사용할 수 있게 export해주고
// 가져온 defineStore()에 첫번째 파라미터로 다른 컴포넌트에서 쓸 이름 설정해주고 (='counter')
// 두번째 파라미터로 store에 관련된 옵션을 정의해주면 된다.
export const useCounterStore = defineStore('counter', {
// 상태
state: () => {},
// computed
getters: {},
// method
actions: {},
})
// src/stores/counter.js
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
// 화살표 함수는 객체 반환시 소괄호 사용 (= return기능)
state: () => ({
counter: 0,
}),
getters: {
doubleCount: state => state.counter * 2,
},
// 상태값을 바꾸고 싶을 떄!
// 여기서 this 쓰는거 유의하기!
actions: {
increment() {
this.counter++
},
},
})
// pinia로 만든 store 사용할 컴포넌트
<template>
<div>
<h2>Store</h2>
<!-- store의 state -->
<p>counter: {{ store.counter }}</p>
<!-- store의 getter -->
<p>doubleCount: {{ store.doubleCount }}</p>
<!-- store의 actions -->
<button @click="store.increment">Click!!</button>
</div>
</template>
<script setup>
import { useRoute } from "vue-router";
import { useCounterStore } from "@/stores/counter";
const route = useRoute();
// 여기가 pinia로 저장된 상태 가져오는 코드!
const store = useCounterStore();
</script>
<script setup>
import { useRoute } from "vue-router";
import { useCounterStore } from "@/stores/counter";
import { storeToRefs } from "pinia";
const route = useRoute();
// store는 reactive로 래핑된 객체다.
// 구조분해할당하면 반응성을 잃게 됨
const store = useCounterStore();
// 구조분해할당하고 싶다면?
const { counter } = storeToRefs(store);
</script>
<script setup>
import { useRoute } from "vue-router";
import { useCounterStore } from "@/stores/counter";
import { storeToRefs } from "pinia";
const route = useRoute();
const store = useCounterStore();
const { counter, doubleCount } = storeToRefs(store);
const { increment } = store;
//아래 코드처럼 상태값 수정 가능!!
**counter.value = 100;**
</script>
Pinia 공식문서를 보면
1. Vuex보다 더 간단한 API를 제공
2. 컴포지션 API 스타일을 제공
3. TypeScript와 사용할 때 견고한 유형 추론을 지원
Vuex의 mutation과는 다르게 store에서 상태 가져오면 바로 수정할 수 있다는게 가장 편해지지 않았나싶다!
아직 강의에서만 다뤄보고 실제로 pinia를 써보지 않았지만
나중에 사용할 일이 있을 때 오늘 정리한 내용을 토대로 사용해보고 느낀점을 남기길!! 🙏🏻
블로그에 배운거 정리하면서 드는 생각인데
인프런 짐코딩님 강의가 정리가 정말 잘되어있다!! (강의교안도 엄청 정리 잘 되어있음)
vue3 강의도 많이 없던데 ㅎㅅㅎ
좋은 강의 만들어주셔서 감사합니다~~~!!
✅ 배우게 된점!
composable이랑 pinia 강의를 들으면서 배우게 된 게 있다.
바로 소괄호 쓰임새!!
1. 구조분해할당 할 때 소괄호를 사용하면 JavaScript 엔진이 코드를 해석할 때 구조 분해 할당 구문을 더 명확하게 인식하고 올바르게 처리할 수 있다고 한다!
2. 화살표 함수의 소괄호 사용법!
() => {return {name: '이자경}}
() => ({name: '이자경'})
➕LEVELUP(1)