Vuex

yuhuo2022-08-02开发库框架库

Vuex 官网open in new window

全局配置

// store/index.js
import rule from "./rule.js";

export default Vuex.createStore({
    // 状态
    state: {
        count: 1,
        order: 1,
    },
    // 状态计算属性
    getters: {
        // 计算state
        doubleCount(state) {
            return state.count * 2;
        },
        // 计算state和getters
        tripleCount(state, getters) {
            return state.count + getters.doubleCount;
        },
        // 返回一个函数,用于外部传参,结果不会缓存
        someCount(state) {
            return function(some) {
                return state.count * some;
            }
        }
    },
    // 状态变更
    mutations: {
        setCount(state, count) {
            state.count = count;
        },
        setOrder(state, payload) {
            state.order = payload.order;
        },
    },
    // 事务处理
    actions: {
        updateCount(context, count) {
            context.commit('setCount', count);
        },
        updateOrder(context, payload) {
            context.commit('setOrder', payload);
        },
    },
    // 子模块
    modules: {
        rule,
    },
    // 严格模式,不是由 mutation 函数引起的状态变更都会抛出错,默认false
    // 不要在发布环境下启用严格模式,以避免性能损失
    strict: false
});
// main.js
import router from "./router/index.js";
import store from "./store/index.js";
import App from "./App.js";

const app = Vue.createApp(App);
app.use(router);
// 作为插件安装
app.use(store);
app.mount("#app");

Module

// store/rule.js
export default {
    // 是否使用命名空间,默认false
    // 
    // 即命名空间配置只是对 getter,mutation,action 起作用。
    namespaced: false,
    state: {
        menu: 1,
    },
    getters: {
        // 计算state
        doubleMenu(state, getters, rootState, rootGetters) {
            return state.menu * 2;
        },
    },
    mutations: {
        setMenu(state, menu) {
            state.menu = menu;
        },
    },
    actions: {
        updateMenu({ state, commit, dispatch, rootState, rootGetters }, menu) {
            // 提交当前模块变更
            commit("setMenu", menu);
            // 提交全局变更
            commit("setCount", menu, { root: true });

            // 提交当前模块事务
            dispatch('otherAction', menu);
            // 提交当全局事务
            dispatch('updateCount', menu, { root: true });
        },
        otherAction() {}
    },
};

注意

  • 不管是否有命名空间,模块 state 的使用都要带上模块前缀。
  • 模块有命名空间时 getter,mutation,action 的使用需要带上模块前缀,反之则不需要。
  • 无命名空间的不同模块与全局之间,不可存在同名 getter,否则会报错。
  • 提交 mutation 和 action 时会提交到对应的无命名空间的多个模块与全局中。

State

全局

export default {
    data() {
        return {
            num: 2,
        };
    },
    computed: {
        // 通过计算属性获取状态
        count() {
            return this.$store.state.count;
        },
        // 三点运算符展开
        ...Vuex.mapState({
            // this.$store.state 简化为参数 state
            count1(state) {
                return state.count * this.num;
            },
            // 不需要this时,使用箭头函数简化
            count2: (state) => state.count,
            // 只对应state时,使用字符串简化
            count3: "count",
        }),
        // 只对应state且名称相同时,使用字符串数组简化
        ...Vuex.mapState(["order"]),
    }
};

模块

export default {
    data() {
        return {
            num: 2,
        };
    },
    computed: {
        menu() {
            return this.$store.state.rule.menu;
        },
        ...Vuex.mapState({
            menu1(state) {
                return state.rule.menu * this.num;
            },
            menu2: (state) => state.rule.menu,
        }),
        // 提取模块前缀,进一步简化
        ...Vuex.mapState("rule", {
            menu1(state) {
                return state.rule.menu * this.num;
            },
            menu2: (state) => state.rule.menu,
            menu3: "menu",
        }),
        ...Vuex.mapState("rule", ["menu"]),
    }
};

Getter

全局

export default {
    computed: {
        someCount() {
            // 需要传参的getters
            return this.$store.getters.someCount(4);
        },
        ...Vuex.mapGetters({
            // 只对应getters时,使用字符串简化
            doubleCount: "doubleCount",
        }),
        // 只对应getters且名称相同时,使用字符串数组简化
        ...Vuex.mapGetters(["tripleCount"]),
	}
};

模块(带命名空间)

export default {
    computed: {
        doubleMenu() {
            return this.$store.getters["rule/doubleMenu"];
        },
        ...Vuex.mapGetters({
            doubleMenu: "rule/doubleMenu",
        }),
        // 提取模块前缀进行简化
        ...Vuex.mapGetters("rule", {
            doubleMenu: "doubleMenu",
        }),
        ...mapGetters("rule", ['doubleMenu']),
	}
};

Mutation

全局

export default {
    methods: {
        addCount() {
            // 载荷形式提交
            this.$store.commit("setCount", this.count + 1);
        },
        addOrder() {
            // 对象形式提交
            this.$store.commit({
                type: "setOrder",
                order: this.order + 1,
            });
        },
        // 将 this.setOrder(xx) 映射为 this.$store.commit('setOrder', xx)
        ...Vuex.mapMutations({
            setOrder: "setOrder",
        }),
        // 将 this.setCount(xx) 映射为 this.$store.commit('setCount', xx)
        ...Vuex.mapMutations(["setCount"]),
	}
};

模块(带命名空间)

export default {
    methods: {
        addMenu() {
            this.$store.commit("rule/setMenu", this.menu + 1);
        },
        ...Vuex.mapMutations({
            setMenu: "rule/setMenu",
        }),
        // 提取模块前缀进行简化
        ...Vuex.mapMutations(("rule", {
            setMenu: "setMenu",
        }),
        ...Vuex.mapMutations("rule", ["setMenu"]),
    },
};

Action

全局

export default {
    methods: {
        reduceCount() {
            // 载荷形式提交
            this.$store.dispatch("updateCount", this.count - 1);
        },
        reduceOrder() {
            // 对象形式提交
            this.$store.dispatch({
                type: "updateOrder",
                order: this.order - 1,
            });
        },
        // 将 this.updateOrder(xx) 映射为 this.$store.commit('updateOrder', xx)
        ...Vuex.mapActions({
            updateOrder: "updateOrder",
        }),
        // 将 this.updateCount(xx) 映射为 this.$store.dispatch('updateCount', xx)
        ...Vuex.mapActions(["updateCount"]),
	}
};

模块(带命名空间)

export default {
    methods: {
        reduceMenu() {
            this.$store.dispatch("rule/updateMenu", this.menu - 1);
        },
        ...Vuex.mapActions({
            updateMenu: "rule/updateMenu",
        }),
        // 提取模块前缀进行简化
        ...Vuex.mapActions(("rule", {
            updateMenu: "updateMenu",
        }),
        ...Vuex.mapActions("rule", ["updateMenu"]),
    },
};

动态注册

// 注册模块 `myModule`
this.$store.registerModule('myModule', {
  // ...
});

// 注册嵌套模块 `nested/myModule`
this.$store.registerModule(['nested', 'myModule'], {
  // ...
},{ 
    // 当前模块注册前已经存在,保留之前的state
    preserveState: true 
});

// 卸载动态注册的模块
this.$store.unregisterModule('myModule');
this.$store.unregisterModule(['nested', 'myModule']);

// 判断模块是否注册
this.store.hasModule('myModule');
this.store.hasModule(['nested', 'myModule']);
Last Updated 2024/3/14 09:51:53