我正在使用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.sidebar
或this.$store.state.sidebar
时,Vue无法找到我的财产。我收到错误:
无法读取未定义的属性全局。
错误也引用了状态,但我相信,因为我使用命名空间,语法应该反映在上面。我试图打电话的地方就在这里。
<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来说还是一个新手。
答案 0 :(得分:3)
我认为主要问题是你的模块状态路径是this.$store.state.site
。
recommended method是使用计算属性。例如
computed: {
menu() {
return this.$store.state.site.sidebar
}
}
您还可以使用mapState
helper
import { mapState } from 'vuex'
export default {
computed: mapState({ menu: state => state.site.sidebar })
}
答案 1 :(得分:2)
当您尝试通过this
访问商店时,this.$store
变量不会引用Vue实例。
data
对象需要是一个返回对象的方法。
data() {
return { menu: this.$store.state.site.sidebar };
}
但是,通过像这样的state
方法检索商店的data
对象中的值,您只需在Vue实例初始化时设置menu
数据属性的值。 menu
的值不会更新以响应商店state
中值的更改。
如果在Vue实例的整个生命周期中需要menu
值反映state
对象,那么您需要使用计算属性或mapState
,如在@菲尔的回答中建议。