# Vuex in Nuxt
๋์คํธ์์ ๋ทฐ์์ค(Vuex)๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํ๋ก์ ํธ ํด๋์ ๋ฃจํธ ๋ ๋ฒจ์ store
ํด๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ๋ฐ์ js
ํ์ผ์ ์์ฑํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Vuex
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ํฌํธ ๋๋ฉด์ ๋ทฐ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
TIP
๋ง์ฝ ํ๋ก์ ํธ ํด๋์ store
ํด๋๊ฐ ์๋ค๋ฉด ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ผ๋ก ๋นํ์ฑํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋นํ์ฑํ๋ ๋น๋ ํ์ผ์ ํฌํจ๋์ง ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
# ๋ทฐ์์ค ์์ํ๊ธฐ
๋ทฐ์์ค๋ Vue.js์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ ํจํด์ ์๋ฏธํฉ๋๋ค. ๋ทฐ์์ค๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅธ๋ค๋ฉด Vuex ์๊ฐ ๊ธ์ ๋จผ์ ํ์ตํ๊ณ ์ดํ ๋ด์ฉ์ ํ์ตํ์ธ์.
๋์คํธ์์ ๋ทฐ์์ค๋ฅผ ์์ํ๊ธฐ ์ํด์๋ store/index.js
ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์
๋ ฅํด์ผ ํฉ๋๋ค.
// store/index.js
export const state = () => ({
user: {}
})
export const mutations = {
setUser(state, user) {
state.user = user;
}
}
export const actions = {
async fetchUser(context) {
const response = await axios.get('users/1');
context.commit('setUser', response.data);
}
}
๊ธฐ์กด ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ ๊ฐ์ด ๊ธฐ๋ณธ ์ฝ๋๋ง ์์ฑํด ์ฃผ๋ฉด ๋์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์ค์ ์์ ์ ์งํํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ทฐ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๋ ์์ฑํ๋ ์๋ ์ค์ ์ฝ๋๊ฐ ํ์ํ์ง ์์ต๋๋ค.
// ์๋ ์ค์ ์ฝ๋๋ Nuxt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก ์์ฑํ๊ณ ์ค์ ํด ์ค
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
new Vuex.Store({
// ...
})
์์์ ์๋ดํ store/index.js
ํ์ผ์ ๋ด์ฉ์ ๋ทฐ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ธฐ์กด์ ๋ทฐ์์ค๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
<template>
<div>
<p>{{ $store.state.user }}</p>
<button @click="displayUser"></button>
</div>
</template>
<script>
export default {
methods: {
displayUser() {
const user = { name: '๋์คํธ' };
this.$store.commit('setUser', user);
}
}
}
</script>
# ๋ทฐ์์ค์ ๋ชจ๋ํ
store
ํด๋ ๋ฐ์ ์์ฑํ index.js
๋ ๋ทฐ์์ค์ ๋ชจ๋ํ ๊ด์ ์์ ๋ฃจํธ ๋ชจ๋์ด ๋ฉ๋๋ค. ๋ง์ฝ index.js
๋ฅผ ์์ฑํ๊ณ ๋ค๋ฅธ ์ด๋ฆ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๋ฉด ๋ทฐ์์ค์ ๋ชจ๋์ด ๋ฉ๋๋ค. products.js
ํ์ผ์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
// store/products.js
export const state = () => ({
items: []
})
export const mutations = {
addItems(state, item) {
state.items.push(item);
}
}
์ ์ฝ๋๋ ๋ง์น ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ์ฝ๋์ ๊ฐ์ด ๋์ํฉ๋๋ค.
// Vue CLI๋ก ์์ฑํ ํ๋ก์ ํธ์์ Vuex๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
new Vuex.Store({
state: () => ({
user: {}
}),
// ...
modules: {
products: {
namespaced: true,
state: () => ({
items: []
}),
mutations: {
addItems(state, item) {
state.items.push(item);
}
}
}
}
})
# nuxtServerInit
nuxtServerInit
์์ฑ์ ๋์คํธ์ universal
๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ์ก์
ํจ์์
๋๋ค.
// store/index.js
actions: {
nuxtServerInit(context, { req }) {
if (req.session.user) {
context.commit('user', req.session.user)
}
}
}
์ ํจ์๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์คํ ์ด์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํด ๋๊ฑฐ๋ ์๋ฒ์์๋ง ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. ๋ง์ฝ, ์๋ฒ์์ ์ธ์ ์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ์ด๊ณ ์ธ์ ์ ์ฐ๊ฒฐ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์คํ ์ด์ ์ ์ฅํด์ผ ํ ๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์คํ ์ด์ ๋ฏธ๋ฆฌ ๋ด์๋์ ์ ์์ต๋๋ค.
nuxtServerInit
์ก์
ํจ์์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์คํ ์ด์ ์ปจํ
์คํธ (opens new window) ์ ๋ณด๋ฅผ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด์
๋๋ค. ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ๋์คํธ์ ์ปจํ
์คํธ (opens new window) ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด์
๋๋ค.
// store/index.js
actions: {
nuxtServerInit(storeContext, nuxtContext) {
storeContext.commit('๋ฎคํ
์ด์
ํจ์๋ช
');
if (process.server) {
const { req, res, beforeNuxtRender } = nuxtContext;
}
}
}
์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ nuxtContext
๋ asyncData
๋ฉ์๋์ context (opens new window) ํ๋ผ๋ฏธํฐ์ ๊ฐ์ต๋๋ค.
โ Data Fetching Middleware โ