Vuex mapstate 对象未定义和“[vuex] 未知突变类型:”
Vuex mapstate object undefined and "[vuex] unknown mutation type: "
我是 vue.js 和 vuex 的新手,我对 mapstate 对象有疑问,首先我的商店中只有一个模块:
-Store
-index.js
-mutations.js
-actions.js
-state.js
state.js :
export default {
userInfo: {
messages: [{ 1: 'test', 2: 'test' }],
notifications: [],
tasks: []
}
}
因此,当我尝试访问 userInfo 对象时,一切正常:
computed: {
...mapState(["userInfo"]),
}
然后我决定创建模块:
-Store
-modules
-ldap.js
-commons.js
-index.js
所以 userInfo
在 commons.js
文件中,现在当我尝试获取对象时,我总是得到 undefined
:
commons.js
// state
const state = {
userInfo: {
messages: [{ 1: 'test', 2: 'test' }],
notifications: [],
tasks: []
}
}
export default {
actions,
mutations,
state
}
Component.vue
computed: {
...mapState(["userInfo"]), // <---- undefined
}
main.js :
import Vue from 'vue'
import Vuex from 'vuex'
import commons from './commons'
import ldap from './modules/ldap'
Vue.use(Vuex)
export default new Vuex.Store({
modules : {
commons,
ldap
}
})
你能告诉我如何访问 userInfo 对象吗?
谢谢。
您必须将每个模块定义为一个单独的商店,这里是一些伪示例。
// authStore.js
import mutations from './authMutations'
import actions from './authActions'
import getters from './authGetters'
const initialState = {
...
}
export default {
state: initialState,
mutations,
actions,
getters
}
然后,注册模块
import authStore from './authStore'
const store = new Vuex.Store({
modules: {
{...authStore, namespaced: true},
{...postStore, namespaced: true} // some other module defined like auth
}
})
new Vue({
....
store: store
})
然后,在组件上使用它:
import { createNamespacedHelpers } from 'vuex'
// map state and actions of the module
const { mapState, mapActions } = createNamespacedHelpers('auth')
export default {
computed: {
...mapState({
prop1: 'prop1'
})
}
}
我猜你已经通过在你的模块中添加 namespaced: true
来命名你的模块。
因此您应该将模块名称作为第一个参数传递给 mapState
助手,以便所有绑定都使用该模块作为上下文来完成。参见 Binding Helpers with Namespace
computed: {
...mapState('commons' , ["userInfo"])
}
正在考虑:
您的commons.js如下:
// state
const state = {
userInfo: {
messages: [{ 1: 'test', 2: 'test' }],
notifications: [],
tasks: []
}
}
export default {
namespaced: true, // <== make sure this is defined
actions,
mutations,
state
}
和main.js像这样导入:
import commons from './commons'
// ..
export default new Vuex.Store({
modules : {
commons,
ldap
}
})
然后 更新 Component.vue:
import { mapState } from 'vuex'
// ...
computed: {
...mapState('commons', ["userInfo"]), // <== add module name here
}
或
import { createNamespacedHelpers } from 'vuex'
const { mapState, mapActions } = createNamespacedHelpers('commons')
// ... notice module name above ^^^^^^^^^
computed: {
...mapState(["userInfo"]),
}
"[vuex] unknown mutation type: "
由于您现在正在为您的 commons
模块命名空间,因此模块的 突变现在必须添加前缀 .
所以,假设你有一个像这样的突变:
const mutations = {
changeName(state, data) {
state.name = data;
}
}
export default {
namespaced: true,
actions,
mutations,
state
}
你用过它:
this.$store.commit('changeName', "New Name");
现在像这样使用它:
this.$store.commit('commons/changeName', "New Name");
文档中确实不清楚但已命名空间:true 需要 使用地图函数。
至少截至本次讨论的最后一条评论
https://github.com/vuejs/vuex/issues/855
无需为模块命名空间,您可以使用 mapstate 的回调变体:
computed: {
...mapState({
userInfo: state => state.commons.userInfo,
}),
},
我是 vue.js 和 vuex 的新手,我对 mapstate 对象有疑问,首先我的商店中只有一个模块:
-Store
-index.js
-mutations.js
-actions.js
-state.js
state.js :
export default {
userInfo: {
messages: [{ 1: 'test', 2: 'test' }],
notifications: [],
tasks: []
}
}
因此,当我尝试访问 userInfo 对象时,一切正常:
computed: {
...mapState(["userInfo"]),
}
然后我决定创建模块:
-Store
-modules
-ldap.js
-commons.js
-index.js
所以 userInfo
在 commons.js
文件中,现在当我尝试获取对象时,我总是得到 undefined
:
commons.js
// state
const state = {
userInfo: {
messages: [{ 1: 'test', 2: 'test' }],
notifications: [],
tasks: []
}
}
export default {
actions,
mutations,
state
}
Component.vue
computed: {
...mapState(["userInfo"]), // <---- undefined
}
main.js :
import Vue from 'vue'
import Vuex from 'vuex'
import commons from './commons'
import ldap from './modules/ldap'
Vue.use(Vuex)
export default new Vuex.Store({
modules : {
commons,
ldap
}
})
你能告诉我如何访问 userInfo 对象吗?
谢谢。
您必须将每个模块定义为一个单独的商店,这里是一些伪示例。
// authStore.js
import mutations from './authMutations'
import actions from './authActions'
import getters from './authGetters'
const initialState = {
...
}
export default {
state: initialState,
mutations,
actions,
getters
}
然后,注册模块
import authStore from './authStore'
const store = new Vuex.Store({
modules: {
{...authStore, namespaced: true},
{...postStore, namespaced: true} // some other module defined like auth
}
})
new Vue({
....
store: store
})
然后,在组件上使用它:
import { createNamespacedHelpers } from 'vuex'
// map state and actions of the module
const { mapState, mapActions } = createNamespacedHelpers('auth')
export default {
computed: {
...mapState({
prop1: 'prop1'
})
}
}
我猜你已经通过在你的模块中添加 namespaced: true
来命名你的模块。
因此您应该将模块名称作为第一个参数传递给 mapState
助手,以便所有绑定都使用该模块作为上下文来完成。参见 Binding Helpers with Namespace
computed: {
...mapState('commons' , ["userInfo"])
}
正在考虑:
您的commons.js如下:
// state const state = { userInfo: { messages: [{ 1: 'test', 2: 'test' }], notifications: [], tasks: [] } } export default { namespaced: true, // <== make sure this is defined actions, mutations, state }
和main.js像这样导入:
import commons from './commons' // .. export default new Vuex.Store({ modules : { commons, ldap } })
然后 更新 Component.vue:
import { mapState } from 'vuex' // ... computed: { ...mapState('commons', ["userInfo"]), // <== add module name here }
或
import { createNamespacedHelpers } from 'vuex' const { mapState, mapActions } = createNamespacedHelpers('commons') // ... notice module name above ^^^^^^^^^ computed: { ...mapState(["userInfo"]), }
"[vuex] unknown mutation type: "
由于您现在正在为您的 commons
模块命名空间,因此模块的 突变现在必须添加前缀 .
所以,假设你有一个像这样的突变:
const mutations = {
changeName(state, data) {
state.name = data;
}
}
export default {
namespaced: true,
actions,
mutations,
state
}
你用过它:
this.$store.commit('changeName', "New Name");
现在像这样使用它:
this.$store.commit('commons/changeName', "New Name");
文档中确实不清楚但已命名空间:true 需要 使用地图函数。
至少截至本次讨论的最后一条评论 https://github.com/vuejs/vuex/issues/855
无需为模块命名空间,您可以使用 mapstate 的回调变体:
computed: {
...mapState({
userInfo: state => state.commons.userInfo,
}),
},