从不同的组件更改 vuex 状态?

pan*_*hro 3 vue.js vuex vuejs2

我有一个依赖于商店的组件(模态)。商店具有模态组件的状态 - 无论它是否处于活动状态。

我需要能够调用此模式以从其他组件打开,甚至仅在标准链接上打开。它通过添加一个类来打开.active

如何更改商店的状态 - 通过调用商店操作或调用模态组件方法(映射到商店)。

模态商店:

class ModalModule {
    constructor() {
        return {
            namespaced: true,

            state: {
                active: false,
            },

            mutations: {
                toggleActive: (state) => {
                    return state.active = ! state.active;
                },
            },

            actions: {
                toggleActive({ commit }) {
                    commit('toggleActive');
                },
            },

            getters: {
                active: state => {
                    return state.active;
                }
            }
        };
    }
}

export default ModalModule;
Run Code Online (Sandbox Code Playgroud)

Vue 组件:

<template>
    <div class="modal" v-bind:class="{ active: active }">
        <div class="modal-inner">
            <h1>modal content here</h1>
        </div>
        <div class="modal-close" v-on:click="this.toggleActive">
            X
        </div>
    </div>
</template>

<script>

import { mapGetters, mapActions } from 'vuex';

export default {
    computed: {
        ...mapGetters('Modal', [
            'active',
        ])
    },
    methods: {
        ...mapActions('Modal', [
            'toggleActive',
        ]),
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

在其他地方我希望能够拥有类似的东西:

<button v-on:click="how to change the state??">OPEN MODAL</button>
Run Code Online (Sandbox Code Playgroud)

编辑:

这是商店:

import Vuex from 'vuex';
import ModalModule from './ModalModule'; 
class Store extends Vuex.Store {
    constructor() {

        Vue.use(Vuex);

        super({
            modules: {
                Modal: new ModalModule(),
            }
        });

    };
}
Run Code Online (Sandbox Code Playgroud)

Vam*_*hna 5

您不需要针对您的特定用例执行操作。您只需定义一个突变,就像您只是更改状态中属性的布尔值一样。操作用于异步功能。你的用例只是布尔值的同步变化

所以你可以做

<button v-on:click="$store.commit('toggleActive')">OPEN MODAL</button>
Run Code Online (Sandbox Code Playgroud)

编辑: 只需导出一个普通对象

const ModalModule = {
            namespaced: true,

            state: {
                active: false,
            },

            mutations: {
                toggleActive: (state) => {
                    return state.active = ! state.active;
                },
            },

            actions: {
                toggleActive({ commit }) {
                    commit('toggleActive');
                },
            },

            getters: {
                active: state => {
                    return state.active;
                }
            }
}

export default ModalModule;// export the module
Run Code Online (Sandbox Code Playgroud)

甚至删除class商店的基础定义

import Vue from 'vue'
import Vuex from 'vuex';
import ModalModule from './ModalModule'; 

Vue.use(Vuex);

export const store = new Vuex.Store({
    modules: {
        ModalModule
    }
});
Run Code Online (Sandbox Code Playgroud)

并在您的组件中像这样更改它以映射突变 ( <MODULE_NAME>/<MUTATION_NAME>)

...mapMutations([
    'ModalModule/toggleActive' 
]) 
Run Code Online (Sandbox Code Playgroud)