
상태 관리
Vue 컴포넌트는 이미 반응형 상태를 관리하고 있음
-> 상태 === 데이터
-> "단방향 데이터 흐름"의 간단한 표현






-> Vue의 공식 상태 관리 라이브러리 === "Pinia"


Vue 공식 상태 관리 라이브러리


// stores/counter.js
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
/*
1. store
- 중앙 저장소
- 모든 컴포넌트가 공유하는 상태, 기능 등이 작성됨
-> defineStore()의 반환 값의 이름은 use의 store를 사용하는 것을 권장
-> defineStore()의 첫번째 인자는 애플리케이션 전체에 걸쳐 사용하는 store의 고유 ID
*/
export const useCounterStore = defineStore('counter', () => {
/*
2. state
- 반응형 상태(데이터)
- ref() === state
*/
const count = ref(0)
/*
3. getters
- 계산된 값
- computed() === getters
*/
const doubleCount = computed(() => count.value * 2)
/*
4. actions
- 메서드
- function() === actions
*/
function increment() {
count.value++
}
/*
Setup Stores의 반환 값
- Pinia의 상태들을 사용하려면 반드시 반환해야 함
※ store에서는 공유 하지 않는 private한 상태 속성을 가지지 않음
*/
return { count, doubleCount, increment }
})
/*
5. plugin
- 애플리케이션의 상태 관리에 필요한 추가 기능을 제공하거나
확장하는 도구나 모듈
- 애플리케이션의 상태 관리를 더욱 간편하고 유연하게 만들어주며
패키지 매니저로 설치 이후 별도 설정을 통해 추가 됨
*/
<!-- App.vue -->
<template>
<div>
<p>state : {{ store.count }}</p>
</div>
</template>
<script setup>
import { useCounterStore } from './stores/counter';
const store = useCounterStore()
// state 참조 및 변경
console.log(store.count)
const newNumber = store.count + 1
</script>
<!-- App.vue -->
<template>
<div>
<p>getters : {{ store.doubleCount }}</p>
</div>
</template>
<script setup>
console.log(store.doubleCount)
</script>
<!-- App.vue -->
<template>
<div>
<button @click="store.increment()">+++</button>
</div>
</template>
<script setup>
// actions 호출
store.increment()
</script>