はじめに
勉強中の身です、そのため勘違い等あるかもしれません。
Vue.js
でのVuex
の書き方?はなんとなくわかっているつもりで
今回簡単なアプリをNuxt.js
で書こうと思いってVuex
の書き方でハマったのでメモとして残します。
Vue.jsの場合
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export const state = {
nowNumber: 0,
};
export const mutations = {
increment(state) {
state.nowNumber++;
},
decrement(state) {
if (state.nowNumber <= 0) return;
state.nowNumber--;
},
reset(state) {
state.nowNumber = 0;
},
};
export const actions = {
increment({ commit }) {
console.log('increment');
commit('increment');
},
decrement({ commit }) {
console.log('decrement');
commit('decrement');
},
reset({ commit }) {
console.log('reset');
commit('reset');
},
};
export default new Vuex.Store({
state,
mutations,
actions,
});
コード自体は気にせずに
こんな感じですよね
これを分割して書くと
export const state = {
nowNumber: 0,
};
こんな感じでファイルをわけて
import Vue from 'vue';
import Vuex from 'vuex';
import state from './state.js'
import mutations from './mutations.js'
import actions from './actions.js'
Vue.use(Vuex);
export default new Vuex.Store({
state,
mutations,
actions,
});
でそのファイルをimport
したら同じ用に使える。
Nuxt.jsの場合
store/index.js
export const state = () => ({
nowNumber: 0,
});
export const mutations = {
//省略
};
export const actions = {
//省略
};
export default ({
state,
mutations,
actions,
});
違いとしてNuxt.js
の場合Vuex
が組み込みになっているみたいなので
import
の必要がないのとstate
が関数になる
問題はここからで、これを分割する場合、上のVue.js
の時と同じ書き方をするとできない。。。
ちゃんと動くようにするには
actions.js
import getters from './getters'
export default {
postMessage({ commit }, message) {
const postData = {
id: getters.fetchId(),
memo: message,
date: getters.fetchDate(),
}
commit('messageBox', postData)
},
}
getters.js
export default {
fetchId() {
const id = //省略
return id
},
fetchDate() {
const d = new Date()
const date = `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日`
return date
},
}
export default
なんですね中身の書き方は同じ感じ
actions
でgetters
使いたいとかの場合import
する必要があるっぽい
後はこれをindex.js
でimport
store/index.js
import getters from './getters'
import actions from './actions'
export const state = () => ({
messages: [],
sample: 'test',
})
export const mutations = {
messageBox(state, messageData) {
state.messages.push(messageData)
},
}
export default {
state,
mutations,
actions,
getters,
}
これで無事使えるようになった!