【Vuex】機能ごとに切り出しモジュールにする
モジュール化
ユーザーと掲示板をストアする機能をそれぞれ別のモジュールとして切り出すみたいなこと。モジュールにするときは記述の仕方が異なる。
Vuexのモジュールが複数ある時、gettersやmutationsなどをそれぞれのモジュールの名前空間に入れなければ使えない。
// store/modules/count.js const state = { count: 2 }; const getters = { doubleCount: state => state.count * 2 }; const mutations = { increment(state, number) { state.count += number } }; const actions = { sync(context, number) { context.commit('increment', number); }, async(context) { setTimeout(() => {...}, 1000); } }; export default { state, getters, mutations, actions namespaced: true // 複数のモジュールがあるときnamespaced: trueが必要 };
大元のファイルでそれぞれのモジュールを読みこむ
// store/index.js import count from './modules/count.js'; export default new Vuex ({ modules: { count: count, foobar: foobar } });
コンポーネントでの記述
名前空間に入ることによって、count/request のような名前になる
methods: { request() { this.$store.dispatch('count/request', number); } } // mapActionsなどの場合 methods: { ...mapActions('count', ['request']) }
コンポーネントから名前空間にコミットする場合、第三引数に{ root: true }が必要
namespace:true とすると起点がモジュールローカルになっているので、root起点にする
methods: { commit('count/increment', number, { root: true })
名前空間で分けたときのgetters, mutations, actionsの呼び出し
mapGetters this.authUser this.$store.getters['users/authUser'] // 大括弧 mapMutationsありとなし this.login this.$store.commit('users/login', user) // 小括弧 mapActionsありとなし this.login this.$store.dispatch('users/login', user) // 小括弧