์ฌ๊ธฐ๋ Vue ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Pinia ์น ํ์ด์ง ํ๊ธํ๋ฅผ ์ํด ํฌํฌํ ์ ์ฅ์ ์ ๋๋ค. 2024-03-31 Open AI API์ GPT-4-turbo ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๊ด ์ฌ๋ฒ์ญ ํ์์ต๋๋ค. ์ผ๋ถ ์ค์ญ ๋ฑ ์๋ชป๋ ๋ถ๋ถ PR ํ์ํฉ๋๋ค.
์ง๊ด์ ์ด๊ณ , ํ์ ์์ ํ๋ฉฐ, ์ ์ฐํ Vue์ Store
- ๐ก ์ง๊ด์ ์ธ
- ๐ ํ์ ์์
- โ๏ธ ๊ฐ๋ฐ์ ๋๊ตฌ ์ง์
- ๐ ํ์ฅ ๊ฐ๋ฅ
- ๐ ๋ชจ๋ํ ์ค๊ณ
- ๐ฆ ๋งค์ฐ ๊ฐ๋ฒผ์
- โฐ๏ธ 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(๋ฃจํธ ์คํ ์ด)๋ฅผ ์์ฑํ๊ณ ์ฑ์ ์ ๋ฌํ์ธ์:
// 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 ๊ตฌ์ฑ์ ํฌํจํ ๋ ์์ธํ ์ง์นจ์ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.
์ํ๋ ๋งํผ ๋ง์ ์คํ ์ด๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฐ ์คํ ์ด๋ ๋ค๋ฅธ ํ์ผ์ ์์ด์ผ ํฉ๋๋ค:
import { defineStore } from 'pinia'
// main์ ์คํ ์ด์ ์ด๋ฆ์
๋๋ค. ์ด ์ด๋ฆ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ๊ณ ์ ํ๋ฉฐ ๊ฐ๋ฐ์ ๋๊ตฌ์ ํ์๋ฉ๋๋ค.
export const useMainStore = defineStore('main', {
// ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ํจ์
state: () => ({
counter: 0,
name: 'Eduardo',
}),
// ์ต์
์ธ getter๋ค
getters: {
// getter๋ค์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ํ๋ฅผ ๋ฐ์ต๋๋ค.
doubleCounter: (state) => state.counter * 2,
// ๋ค๋ฅธ getter์์ getter ์ฌ์ฉ
doubleCounterPlusOne(): number {
return this.doubleCounter + 1
},
},
// ์ต์
์ธ ์ก์
actions: {
reset() {
// `this`๋ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
this.counter = 0
},
},
})
defineStore
๋ ์คํ ์ด์ ์ ๊ทผํ๋ ค๋ฉด ํธ์ถํด์ผ ํ๋ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค:
import { useMainStore } from '@/stores/main'
import { storeToRefs } from 'pinia'
export default defineComponent({
setup() {
const main = useMainStore()
// ํน์ ์คํ ์ด ์์ฑ์ ์ถ์ถํฉ๋๋ค.
const { counter, doubleCounter } = storeToRefs(main)
return {
// ํ
ํ๋ฆฟ์์ ์ ์ฒด ์คํ ์ด์ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
main,
// ํน์ ์ํ ๋๋ getter์๋ง ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
counter,
doubleCounter,
}
},
})
Pinia์ ๋ํด ๋ ์์๋ณด๋ ค๋ฉด ํ๊ธ ๋ฌธ์๋ฅผ ํ์ธํ์ธ์.