vuexについての記事はこちら↓
機能ごとにコードを分割
store.jsは大規模な開発になると肥大化するため、用途ごとにパーツ分けをすると保守運用が効率的になる。
まず、src直下にstoreフォルダを作成し、storeフォルダの直下にmodulesフォルダを作成する。storeフォルダ直下のディレクトリは下記の通り。
modulesの中にあるjsファイルは、用途ごとに分割したもの
store
│ index.js
│
└─modules
count.js
name.js
用途に応じて機能を分割させたファイル(modules)には、それぞれstate,getters,mutations,actionsのオブジェクトを作成し、エクスポートを行う。
const state = {
name: 'Mory',
message:''
};
const getters = {
message:state =>state.message,
name:state => state.name
};
const mutations = {
updateMessage(state,newMessage){
state.message = newMessage
},
updateName(state,newName){
state.name = newName
}
};
const actions = {
updateMessage({commit},newMessage){
commit('updateMessage',newMessage);
},
updateName({commit},newName){
commit('updateName',newName)
}
};
export default{
state,
getters,
mutations,
actions
}
index.jsに各モジュールファイル(name.js等)のインポートを記載する。
import Vue from 'vue';
import Vuex from 'vuex';
import count from "./modules/count";
import name from "./modules/name";
Vue.use(Vuex);
export default new Vuex.Store({
modules:{
count,
name
}
});
上記では、モジュールごとに分けたが、gettersごとmutationsごとactionsごとに分ける事も可能。
その場合、storeフォルダ直下にgetters,mutations,actionsファイルを作成する。
store
│ actions.js
│ getters.js
│ mutations.js
│ index.js
└─modules
gettersの部分はgetters.jsにmutationsの部分はmutations.jsにコピペする。
mutations.jsの例はこちら
export default{
updateName(state,newName){
state.name = newName
},
increment(state, number) {
state.count += number;
},
decrement(state, number) {
state.count -= number;
}
};
それぞれのgetters,mutations,actionsのjsファイルをindex.jsでインポートする。
import Vue from 'vue';
import Vuex from 'vuex';
import getters from "./getters";
import mutations from "./mutations";
import actions from "./actions";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
name: 'Mory',
message: '',
count: 0,
},
getters,
mutations,
actions,
});
モジュール間で同じ
万が一、別のモジュールの中に同じ状態・名前のgettersがあったとしても競合を回避するために、名前空間を利用する。
名前空間を使うには、各モジュールに
namespaced: true
を付与する。
これを付与することで、変数名の頭にモジュール名が付きハイフンで区切られる。
gettersにcounterという変数があるとすると変数名はcount/counterという名前になる。
export default {
namespaced: true,
state,
getters,
mutations,
actions
};
コンポーネントで上記関数を利用したい時は、namespacedで変数名が変わっているので、このように呼び出しを行う。
mapGettersで呼び出しを行っている場合↓
...mapGetters("count",["counter", "doubleCounter"])
// 第一引数にモジュール名を入れる。
mapGettersを使用しない場合↓
computed:{
counter(){
return this.$store.getters["count/counter"];
}
}

