我有一个带有模块的存储库。这是结构:
存储声明:
Vue.use(Vuex);
export const store = new Vuex.Store({
strict: process.env.NODE_ENV !== "production", //Защита от изменений не через мутациии
modules: {
navigation: navigation,
crudForm: crudForm,
toastBar: toastBar,
progressDialog: progressDialog,
loginForm: loginForm,
auth: auth
},
getters: globalGetters,
mutations: globalMutations,
actions: globalActions,
state: globalState
});
router.beforeEach((to, from, next) => {
if (to.name !== "login" && !store.getters["auth/isAuthenticated"]) {
next({name: "login"});
}else {
next()
}
});
在 state.js (global) 中,描述了全局状态,我在其中声明了以下内容:
export default {
loginForm: {
title: "Авторизация",
toast: "Пользователь авторизован",
handler: {
request: {
url: "/internalauth/auth",
type: POST,
parameters: {
login: {
required: true
},
password: {
required: true
}
}
}
}
},
pages: [
...
//... Много объектов со вложенными составными объектами, подобных loginForm
]
}
loginForm 模块的操作:
//loginForm/signIn (action)
async signIn ({state, rootState, dispatch}) {
let overlayTimeout = setTimeout(() => dispatch("progressDialog/show", null, {root: true}), 1500);
console.log(rootState.loginForm.handler); //undefined
await dispatch("auth/signIn", {
handler: rootState.loginForm.handler,
login: state.login,
password: state.password
}, { root: true });
clearTimeout(overlayTimeout);
dispatch("progressDialog/close", null, {root: true});
}
我需要在 loginForm 模块中获取 loginForm (全局状态),以及所有嵌套对象(及其默认值)。
无论我在哪里尝试获得这种状态,只有标题和 toast 字段被填充,并且处理程序始终未定义。
我试图通过 rootState、mapState(在组件中)、rootGetters(在 state.loginForm.handler 上包装 getter)、mapGetters(在组件中)、this.$store.state.loginForm,没有任何帮助,loginForm.handler 始终为空.
我做错了什么,那我该怎么办?请解释。同样,我从处于全局状态的 pages 数组中获得了类似的复杂对象,并且所有嵌套对象都填充了它。
如果我理解正确,vuex 不会使处理程序反应,我该如何解决这个问题?我知道我可以在应用程序启动时通过 vue.set(...) 在 init 全局状态突变中显式初始化所有这些状态,但这并不方便。我的全局 state.js 有点像全局配置,方便快速配置整个应用环境