了解です!
では続けて 第5章 5.4 複数モジュール対応のコンポーザル関数設計 に進みます。
ここでは、
Vuex で namespaced
モジュールが複数ある場合に、
コンポーザル関数をどう設計するか?
安全でわかりやすく、ミスしない書き方を解説します。
// store/index.ts
import Vue from 'vue';
import Vuex from 'vuex';
import { counter } from './modules/counter';
import { user } from './modules/user';
Vue.use(Vuex);
export interface RootState {
counter: CounterState;
user: UserState;
}
export default new Vuex.Store<RootState>({
modules: {
counter,
user,
},
});
// store/modules/counter.ts
export interface CounterState {
count: number;
}
export const counter = {
namespaced: true,
state: (): CounterState => ({
count: 0,
}),
mutations: {
increment(state: CounterState) {
state.count += 1;
},
},
getters: {
doubleCount(state: CounterState) {
return state.count * 2;
},
},
actions: {
async increment({ commit }) {
await new Promise((resolve) => setTimeout(resolve, 500));
commit('increment');
},
},
};
src/composables/useCounterStore.ts
// useStoreと型をインポート
import { useStore } from 'vuex';
import { RootState } from '@/store';
import { computed } from 'vue';
// Counterモジュール専用のコンポーザル関数
export const useCounterStore = () => {
const store = useStore<RootState>();
// counterモジュールのstateを取得
const count = computed(() => store.state.counter.count);
// counterモジュールのgetterを取得
const doubleCount = computed(() => store.getters['counter/doubleCount'] as number);
// counterモジュールのmutation
const increment = () => {
store.commit('counter/increment');
};
// counterモジュールのaction
const incrementAsync = async () => {
await store.dispatch('counter/increment');
};
return {
count,
doubleCount,
increment,
incrementAsync,
};
};