Vuex在带命名空间的模块内访问全局命名空间
本帖最后由 ing 于 2020-7-19 15:43 编辑你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名模块 moduleA.js 添加 namespaced: true 使其成为带命名空间的模块
```
export default {
namespaced: true,
state: {
text: 'moduleA'
},
getters: {
detail(state, getters, rootState) {
return state.text + '-' + rootState.name;
}
},
mutations: {
setName(state, newName) {
state.name = newName;
}
},
actions: {
callAction({ dispatch, commit, getters }){
// 在带命名空间的模块内访问全局内容
commit('setName','change',{root:true});
console.log("dispatch.text-getters.name:"+dispatch.text+"-"+getters.name);
}
}
}
```
我不理解,他已经是带命名空间的模块了,为什么 mutation 却是全局命名空间?需要在 callAction->commit 传入第三个参数 {root:true} 才可以访问到 mutations 下的 setName 方法
如果 mutation 也是带命名空间,那么我应该是不需要传入参数 {root:true}
参考
https://vuex.vuejs.org/zh/guide/modules.html
https://www.jianshu.com/p/83d5677b0928 针对你的问题,
第一个问题
带命名空间的模块中,mutation为什么是全局的?
官网中没看到这样的说法,你po的代码也无法表示mutation是全局命名空间的.
参考你引用内容的最后一句.会自动根据模块注册的路径调整命名
第二个问题
如果action中访问的当前模块的mutation,则不需要传root true
moduleA被命名空间局部化,mutations与actions如官网所示"会自动根据模块注册的路径调整命名"
分发actions需要加上命名空间,如"moduleA/action"
在moduleA/action内部,访问mutation时,会使用当前环境(moduleA)的mutations,并且不用加空间名.
但是你要访问其他同名且全局的mutation时候怎么办,这时候给root true就可以了.
cube 发表于 2020-7-20 11:35
针对你的问题,
第一个问题
带命名空间的模块中,mutation为什么是全局的?
访问其他同名且全局的mutation时候怎么办,这时候给root true就可以了
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错无法访问到,在 commit 加上 {root:true} 后才访问到。
ing 发表于 2020-7-20 18:36
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错 ...
没有你的代码,不好评判!
不过我猜测,你使用的实例不是modulea的实例! ing 发表于 2020-7-20 18:36
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错 ...
如果你的代码仅仅是上面一个moduleA,那么我猜测引用的有问题
应该这样
...mapactions("moduleA",["callaction"])
或者是完整的命名空间限定符
实际上这里用命名空间就是实现了一个伪限定!
"moduleA/callaction"依然是全局的,只是全局中没有了"callaction"
这些在官网中有说明! cube 发表于 2020-7-20 19:17
没有你的代码,不好评判!
不过我猜测,你使用的实例不是modulea的实例!下载按钮在最左上角
https://quqi.avyeld.com/s/2177545/BuXUUQ0hEv5vZiq6
页:
[1]