公司技术栈vue,所以状态管理用到了vuex,使用单一的状态树去管理所有的状态会让应用变得很复杂,store对象也会变得很臃肿。为了解决这个问题,就用到了module模块。每个模块拥有自己的state、mutation、action、getter。下面举一个简单的例子:
首先,创建一个store.js:
import Vue from 'vue'; import Vuex from 'vuex'; //引入子模块 import moduleA from './moduleA'; import moduleB from './moduleB'; Vue.use(Vuex); export default new Vuex.Store({ //这里的state就是全局的 state: { count: 10 }, //注册模块 modules: { a: moduleA, b: moduleB } });
moduleA文件:
const moduleA = { namespaced: true, //命名空间,可以使该模块成为有命名空间的模块,具有更高的封装度和复用性 state: { name: '张三', sex: '男', list: [ {id: 1, msg: '我的生活'}, {id: 2, msg: '抽烟'}, {id: 3, msg: '喝酒'}, {id: 4, msg: '烫头'} ] }, getters: { listData(state) { return state.list } }, mutations: { getName(state) { return '名称:' + state.name; } } }; export default moduleA;
moduleB文件:
const moduleB = { namespaced: true, state: { name: '陈小凤', sex: '女', count: 2 }, mutations: { getName(state) { return '名称:' + state.name; }, increment(state) { state.count++; } }, actions: { incrementHandle({state, commit, rootState}) { //这里的state就是指当前模块的state数据,rootState指的是全局state if ((state.count + rootState.count) < 15) { commit('increment'); } } } }; export default moduleB;
vue文件:
<template> <div id="app"> <h2>{{name1}}</h2> <h2>{{name2}}</h2> <h2>{{count}}</h2> <ul> <li v-for="item in list" :key="item.id">{{item.msg}}</li> </ul> <button type="button" name="button" @click="addCount">计算</button> </div> </template> <script> import {mapState, mapGetters, mapActions} from 'vuex'; export default { name: 'App', computed: { ...mapGetters('a', { list: 'listData' }), ...mapState('a', { // name1: state => state.name name1: 'name' }), ...mapState('b', { name2: state => state.name, count: state => state.count }) }, methods: { ...mapActions('b', ['incrementHandle']), addCount() { this.incrementHandle(); } } } </script>