์ง๊ด์ ์ด๊ณ ์ ์ฐํ Vue.js ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๐ก ์ง๊ด์
- ๐ Type-safe
- โ๏ธ ๊ฐ๋ฐ ๋๊ตฌ ์ง์
- ๐ ํ์ฅ ๊ฐ๋ฅ
- ๐ ๋ชจ๋์ ์ค๊ณ
- ๐ฆ ๊ทน๋๋ก ๊ฐ๋ฒผ์
- โฐ๏ธ Nuxt ๋ชจ๋
Pinia๋ Vue 2์ Vue 3 ๋ชจ๋์์ ์๋ํฉ๋๋ค.
Pinia๋ ์คํ์ธ์ด๋ก 'ํ์ธ์ ํ'์ด๋ผ๋ ๋จ์ด์ ๊ฐ์ฅ ์ ์ฌํ ์์ด ๋ฐ์์ ๋๋ค: piรฑa. ์ค์ ๋ก ํ์ธ์ ํ์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ๊ฝ๋ค์ด ๋ชจ์ฌ ํ๋์ ๋ค์ค ๊ณผ์ผ์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์คํ ์ด๋ค์ฒ๋ผ, ๊ฐ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ํ์ํ์ง๋ง, ๊ฒฐ๊ตญ ๋ชจ๋ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ํ ๋จ์๋ฉ๋ฆฌ์นด ์์ฐ์ ๋ง์๋ ์ด๋ ๊ณผ์ผ์ ๋๋ค.
์ด ํ๋ก์ ํธ์ ๊ฐ๋ฅํ ์ง๋ฌธ์ ๋ํ ๋ช ๊ฐ์ง ๋ ธํธ:
Q: Pinia๋ Vuex์ ํ์์์ธ๊ฐ์?
A: ์
Q: ๋์ ๋ชจ๋์ ์ด๋ป๊ฒ ๋๋์?
A: ๋์ ๋ชจ๋์ ํ์ ์์ ํ์ง ์์ผ๋ฏ๋ก, ๋์ ๋ค๋ฅธ ์คํ ์ด๋ฅผ ๋ง๋ค ์ ์๊ฒ ํ์ฉํฉ๋๋ค ๊ทธ๋ฆฌ๊ณ ์ด๋์๋ ์ํฌํธํ ์ ์์ต๋๋ค
# ๋๋ pnpm ๋๋ yarn
npm install pinia
Vue <2.7์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ต์ @vue/composition-api
๋ฅผ ์ค์นํ์ธ์:
npm install pinia @vue/composition-api
pinia(๋ฃจํธ store)๋ฅผ ์์ฑํ๊ณ ์ฑ์ ์ ๋ฌํ์ธ์:
// Vue 3
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
app.mount('#app')
// Vue 2
import { createPinia, PiniaVuePlugin } from 'pinia'
Vue.use(PiniaVuePlugin)
const pinia = createPinia()
new Vue({
el: '#app',
// ๊ธฐํ ์ต์
...
// ...
// ํ์ด์ง ๋ด ์ฌ๋ฌ Vue ์ฑ์์ ๋์ผํ `pinia` ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
pinia,
})
Nuxt ๊ตฌ์ฑ์ ํฌํจํ ๋ ์์ธํ ์ง์นจ์ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
You can create as many stores as you want, and they should each exist in different files: ์ํ๋ ๋งํผ store๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฐ store๋ ์๋ก ๋ค๋ฅธ ํ์ผ์ ์์ด์ผ ํฉ๋๋ค:
import { defineStore } from 'pinia'
// main is the name of the store. It is unique across your application
// and will appear in devtools
// main์ ์คํ ์ด์ ์ด๋ฆ์
๋๋ค.
// ์ด ์ด๋ฆ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ๊ณ ์ ํ๋ฉฐ devtools์ ํ์๋ฉ๋๋ค.
export const useMainStore = defineStore('main', {
// ํ์: ์๋ก์ด ์ํ(state)๋ฅผ ๋ฐํํ๋ ํจ์
state: () => ({
counter: 0,
name: 'Eduardo',
}),
// ์ ํ: getters
getters: {
// getter๋ค์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก state๋ฅผ ์ ๋ฌ ๋ฐ์ต๋๋ค.
doubleCounter: (state) => state.counter * 2,
// ๋ค๋ฅธ getter์์ getter ์ฌ์ฉ
doubleCounterPlusOne(): number {
return this.doubleCounter + 1
},
},
// ์ ํ: actions
actions: {
reset() {
// `this`๋ store ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
this.counter = 0
},
},
})
defineStore
๋ store์ ์ ๊ทผํ๋ ค๋ฉด ํธ์ถํด์ผ ํ๋ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค:
import { useMainStore } from '@/stores/main'
import { storeToRefs } from 'pinia'
export default defineComponent({
setup() {
const main = useMainStore()
// ํน์ store ์์ฑ์ ์ถ์ถํฉ๋๋ค.
const { counter, doubleCounter } = storeToRefs(main)
return {
// ํ
ํ๋ฆฟ์์ main์ด๋ผ๋ store ์ ์ฒด๋ฅผ ์ด์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
main,
// ํน์ state ๋๋ getter๋ง ์ด์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
counter,
doubleCounter,
}
},
})
Pinia์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด ํ๊ธ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.