ing 发表于 2020-7-19 15:36

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

cube 发表于 2020-7-20 11:35

针对你的问题,
第一个问题
带命名空间的模块中,mutation为什么是全局的?
官网中没看到这样的说法,你po的代码也无法表示mutation是全局命名空间的.
参考你引用内容的最后一句.会自动根据模块注册的路径调整命名
第二个问题
如果action中访问的当前模块的mutation,则不需要传root true


moduleA被命名空间局部化,mutations与actions如官网所示"会自动根据模块注册的路径调整命名"
分发actions需要加上命名空间,如"moduleA/action"
在moduleA/action内部,访问mutation时,会使用当前环境(moduleA)的mutations,并且不用加空间名.
但是你要访问其他同名且全局的mutation时候怎么办,这时候给root true就可以了.

ing 发表于 2020-7-20 18:36

cube 发表于 2020-7-20 11:35
针对你的问题,
第一个问题
带命名空间的模块中,mutation为什么是全局的?


访问其他同名且全局的mutation时候怎么办,这时候给root true就可以了
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错无法访问到,在 commit 加上 {root:true} 后才访问到。

cube 发表于 2020-7-20 19:17

ing 发表于 2020-7-20 18:36
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错 ...

没有你的代码,不好评判!
不过我猜测,你使用的实例不是modulea的实例!

cube 发表于 2020-7-20 19:30

ing 发表于 2020-7-20 18:36
可我这里访问的是 moduleA.js 自身的 mutation,所以才有了 commit 不传 {root:true} 的尝试,结果报错 ...

如果你的代码仅仅是上面一个moduleA,那么我猜测引用的有问题
应该这样
...mapactions("moduleA",["callaction"])
或者是完整的命名空间限定符

实际上这里用命名空间就是实现了一个伪限定!
"moduleA/callaction"依然是全局的,只是全局中没有了"callaction"
这些在官网中有说明!

ing 发表于 2020-7-21 08:48

cube 发表于 2020-7-20 19:17
没有你的代码,不好评判!
不过我猜测,你使用的实例不是modulea的实例!下载按钮在最左上角
https://quqi.avyeld.com/s/2177545/BuXUUQ0hEv5vZiq6
页: [1]
查看完整版本: Vuex在带命名空间的模块内访问全局命名空间