吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1303|回复: 5
收起左侧

[求助] Vuex在带命名空间的模块内访问全局命名空间

[复制链接]
ing 发表于 2020-7-19 15:36
本帖最后由 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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 02:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表