模块化思想
我们之前的博文已经讲述了Vuex怎么使用命名空间实现模块化状态管理。详情可以看:
动态模块场景
动态模块的设计理念是为了方便前端随时挂载和卸载状态管理器模块。
模块书写
import { dailyStatistics, getList } from '@/api/perception/index.js';
export const INSTALL_MODULE_PATH = 'moduleStore/perception';
export default {
namespaced: true,
state: {
dailyStatistics: {},
recordsList: {}
},
mutations: {
saveDailyStatistics(state, loadData) {
state.dailyStatistics = loadData;
},
saveRecordsList(state,loadData) {
state.recordsList = loadData
}
},
actions: {
/**
* @name 获取数据
*/
getDailyStatistics({ commit }) {
return dailyStatistics().then(res => {
commit('saveDailyStatistics', res.data || {});
});
},
getRecordsList({ commit }, {pageA,stepNum,info}) {
...
commit('saveRecordsList', {
total:res.data.total,
list
})
});
}
},
getters: {
mockFireHotData(state){
return state.recordsList.list.map(t => {
t.eventType = 3
return t
})
}
},
};
与正常的模块没什么区别的,只是多导出了一个路径变量。用于指定她在仓库里的位置。
挂载和卸载
import PERCEPTION_MODULE, {INSTALL_MODULE_PATH,} from '@/store/modules/perception';
beforeCreate() {
// 注册状态管理器模块
this.$store.registerModule(INSTALL_MODULE_PATH, PERCEPTION_MODULE);
},
beforeDestroy() {
// 卸载管理器模块
this.$store.unregisterModule(INSTALL_MODULE_PATH);
},
此时挂载上去的仓库位于this.$store.moduleStore/perception里
使用
// 调用actions
await this.$store.dispatch(`${INSTALL_MODULE_PATH}/getRecordsList`, {...});
// 调用仓库
this.$store.state[INSTALL_MODULE_PATH].xxxx
// 调用mutations
this.$store.commit(`${INSTALL_MODULE_PATH}/saveDailyStatistics`, {...});
// 调用getter
this.$store.getters[`${INSTALL_MODULE_PATH}/mockFireHotData`]