1

我正在使用一个带有 Vue、Vuetify、Vue-Router 和 Vuex 的项目。其目的是创建一个带有侧边栏的基本布局,采用更模块化的方法,以涉足 Vue 的可扩展性。所以我创建了一个名为 Store 的文件夹,里面有一个 modules 文件夹。所以我在 store 文件夹中的索引文件如下:

import Vue from 'vue';
import Vuex from 'vuex';
import global from './Modules/Global';

Vue.use(Vuex);

export default new Vuex.Store({
     modules: {
          site: global
     }
});

该模块被分解为一个包含动作、getter、突变和状态的文件。

const actions = {
    sidebarState: ({ commit }, status) => {
        commit('openOrCloseSidebar', status);
    }
}

const mutations = {
    openOrCloseMenu: (status) => {
        if (status !== true)
            return state.sidebar = true;

        return state.sidebar = false;
    }
};

const getters = {

};

const state = {
    sidebar: true
};

export default {
    namespaced: true,
    actions,
    mutations,
    getters,
    state
};

我如下调用 Vue 实例。

import Vue from 'vue/dist/vue';
import Vuetify from 'vuetify';
import Axios from 'axios';

import application from './Template/Application.vue';

import router from './Router';
import store from './Store';
import { sync } from 'vuex-router-sync';

Vue.use(Vuetify);
Vue.use(router);
Vue.use(store);

sync(store, router);

var vue = new Vue({
    el: '#application',
    template: '<application></application>',
    components: {
        application
    },

    router: router,
    store: store
});

但是,当我打电话this.$store.global.state.sidebarthis.$store.state.sidebarVue 无法找到我的财产时。我收到错误:

无法读取未定义的全局属性。

该错误还引用了状态,但我相信由于我使用的是命名空间,因此语法应该反映在上面。我试图称呼它的地方就在这里。

<template>
    <v-container>
        <application_sidebar :my-prop="menu"></application_sidebar>
        <application_navigation :my-prop="menu"></application_navigation>        
    </v-container>
</template>

<script type="text/javascript">
    import application_navigation from './Navigation.vue'
    import application_sidebar from './Sidebar.vue';
    import { mapState } from 'vuex';

    export default ({
        components: {
            application_navigation,
            application_sidebar
        },

        data: {
            menu: this.$store.global.state.sidebar
        }
    });
</script>

我正在尝试访问我的状态并学习如何正确发射,因此在导航组件中我可以向上发射,以便反映该值以移动侧边栏打开或关闭。

任何帮助都会很棒,我对 Vue 还是很陌生。

4

2 回答 2

4

我认为主要问题是您通往模块状态的路径应该是this.$store.state.site.

推荐的方法是使用计算属性。例如

computed: {
  menu() {
    return this.$store.state.site.sidebar
  }
}

你也可以使用mapState助手

import { mapState } from 'vuex'

export default {
  computed: mapState({ menu: state => state.site.sidebar })
}
于 2018-03-01T22:25:23.420 回答
2

this您尝试通过this.$store.

data对象必须是返回对象的方法。

data() {
  return { menu: this.$store.state.site.sidebar };
}

state但是,通过像这样的方法从 store 的对象中检索值data,您只是menu在 Vue 实例初始化时设置 data 属性的值。的值menu 不会随着 store 中值的变化而更新state

如果您需要该menu值在 Vue 实例的整个生命周期中反映state对象,那么您需要使用计算属性 or mapState,正如@Phil 的回答中所建议的那样。

于 2018-03-01T21:31:13.437 回答