【Vue.js】Vuex~store.jsを分割する~

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"];
    }
}
タイトルとURLをコピーしました