一、为什么需要模块化

前面我们讲到的例子都在一个状态树里进行,当一个项目比较大时,所有的状态都集中在一起会得到一个比较大的对象,进而显得臃肿,难以维护。为了解决这个问题,Vuex允许我们将store分割成模块(module),每个module有自己的state,mutation,action,getter,甚至还可以往下嵌套模块,下面我们看一个典型的模块化例子
const moduleA = {
state: {....},
mutations: {....},
actions: {....},
getters: {....}
}
const moduleB = {
state: {....},
mutations: {....},
actions: {....},
getters: {....}
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // moduleA的状态
store.state.b // moduleB的状态
二、模块的局部状态
模块内部的mutation和getter,接收的第一参数(state)是模块的局部状态对象,rootState
const moduleA = {
state: { count: 0},
mutations: {
increment (state) {
// state是模块的局部状态,也就是上面的state
state.count++
}
},
getters: {
doubleCount (state, getters, rootState) {
// 参数 state为当前局部状态,rootState为根节点状态
return state.count * 2
}
},
actions: {
incremtnIfOddRootSum ( { state, commit, rootState } ) {
// 参数 state为当前局部状态,rootState为根节点状态
if ((state.cont + rootState.count) % 2 === 1) {
commit('increment')
}
}
}
}
三、命名空间(这里一定要看,不然有些时候会被坑)
上面所有的例子中,模块内部的action、mutation、getter是注册在全局命名空间的,如果你在moduleA和moduleB里分别声明了命名相同的action或者mutation或者getter(叫some),当你使用store.commit('some'),A和B模块会同时响应。所以,如果你希望你的模块更加自包含和提高可重用性,你可以添加namespaced: true的方式,使其成为命名空间模块。当模块被注册后,它的所有getter,action,mutation都会自动根据模块注册的路径调用整个命名,例如:
const store = new Vuex.Store({
modules: {
account: {
namespaced: true,
state: {...}, // 模块内的状态已经是嵌套的,namespaced不会有影响
getters: { // 每一条注释为调用方法
isAdmin () { ... } // getters['account/isAdmin']
},
actions: {
login () {...} // dispatch('account/login')
},
mutations: {
login () {...} // commit('account/login')
},
modules: { // 继承父模块的命名空间
myPage : {
state: {...},
getters: {
profile () {...} // getters['account/profile']
}
},
posts: { // 进一步嵌套命名空间
namespaced: true,
getters: {
popular () {...} // getters['account/posts/popular']
}
}
}
}
}
})
启用了命名空间的getter和action会收到局部化的getter,dispatch和commit。你在使用模块内容时不需要再同一模块内添加空间名前缀,更改namespaced属性后不需要修改模块内的代码。
四、在命名空间模块内访问全局内容(Global Assets)
如果你希望使用全局state和getter,roorState和rootGetter会作为第三和第四参数传入getter,也会通过context对象的属性传入action若需要在全局命名空间内分发action或者提交mutation,将{ root: true }作为第三参数传给dispatch或commit即可。
modules: {
foo: {
namespaced: true,
getters: {
// 在这个被命名的模块里,getters被局部化了
// 你可以使用getter的第四个参数来调用 'rootGetters'
someGetter (state, getters, rootSate, rootGetters) {
getters.someOtherGetter // -> 局部的getter, ‘foo/someOtherGetter'
rootGetters.someOtherGetter // -> 全局getter, 'someOtherGetter'
}
},
actions: {
// 在这个模块里,dispatch和commit也被局部化了
// 他们可以接受root属性以访问跟dispatch和commit
smoeActino ({dispatch, commit, getters, rootGetters }) {
getters.someGetter // 'foo/someGetter'
rootGetters.someGetter // 'someGetter'
dispatch('someOtherAction') // 'foo/someOtherAction'
dispatch('someOtherAction', null, {root: true}) // => ‘someOtherAction'
commit('someMutation') // 'foo/someMutation'
commit('someMutation', null, { root: true }) // someMutation
}
}
}
}
五、带命名空间的绑定函数
前面说过,带了命名空间后,调用时必须要写上命名空间,但是这样就比较繁琐,尤其涉及到多层嵌套时(当然开发中别嵌套太多,会晕。。)
下面我们看下一般写法
computed: {
...mapState({
a: state => state.some.nested.module.a,
b: state => state.some.nested.module.b
}),
methods: {
...mapActions([
'some/nested/module/foo',
'some/nested/module/bar'
])
}
}
对于这种情况,你可以将模块的命名空间作为第一个参数传递给上述函数,这样所有的绑定会自动将该模块作为上下文。简化写就是
computed: {
...mapStates('some/nested/module', {
a: state => state.a,
b: state => state.b
})
},
methods: {
...mapActions('some/nested/module',[
'foo',
'bar'
])
}
六、模块重用
有时我们可能创建一个模块的多个实例,例如:
如果我们使用一个纯对象来声明模块的状态,那么这个状态对象会通过引用被共享,导致数据互相污染。
实际上Vue组件内data是同样的问题,因此解决办法也是一样的,使用一个函数来声明模块状态(2.3.0+支持)
const MyModule = {
state () {
return {
foo: 'far'
}
}
}
七、总结
到这里模块化(module)的内容就已经讲完了,本次主要讲解了module出现的原因,使用方法,全局和局部namespaced模块命名空间,局部访问全局内容,map函数带有命名空间的绑定函数和模块的重用。
引用
https://vuex.vuejs.org Vuex官方文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vuex
# 模块化
# Vue.js实战之Vuex的入门教程
# 详解Vuex管理登录状态
# 全站最详细的Vuex教程
# 在vue中使用vuex
# 修改state的值示例
# Vue3中vuex的基本使用方法实例
# vuex使用方法超详细讲解(实用)
# 你可以
# 绑定
# 如果你
# 在这个
# 多个
# 你在
# 比较大
# 自己的
# 太多
# 也会
# 还可以
# 都在
# 第一个
# 不需要
# 当你
# 说过
# 要在
# 下一
# 这种情况
# 使其
相关文章:
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
MySQL查询结果复制到新表的方法(更新、插入)
成都网站制作公司哪家好,四川省职工服务网是做什么用?
制作表格网站有哪些,线上表格怎么弄?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
宝塔面板创建网站无法访问?如何快速排查修复?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
,想在网上投简历,哪几个网站比较好?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何快速使用云服务器搭建个人网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
音响网站制作视频教程,隆霸音响官方网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
北京网站制作网页,网站升级改版需要多久?
如何实现建站之星域名转发设置?
css网站制作参考文献有哪些,易聊怎么注册?
简单实现Android文件上传
定制建站流程解析:需求评估与SEO优化功能开发指南
如何访问已购建站主机并解决登录问题?
建站之星备案是否影响网站上线时间?
如何在宝塔面板中修改默认建站目录?
如何在局域网内绑定自建网站域名?
网站制作的步骤包括,正确网址格式怎么写?
大连网站设计制作招聘信息,大连投诉网站有哪些?
,有什么在线背英语单词效率比较高的网站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何在Golang中使用replace替换模块_指定本地或远程路径
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
模具网站制作流程,如何找模具客户?
公司网站的制作公司,企业网站制作基本流程有哪些?
制作旅游网站html,怎样注册旅游网站?
如何快速查询网站的真实建站时间?
公司门户网站制作流程,华为官网怎么做?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
建站之星后台密码如何安全设置与找回?
h5在线制作网站电脑版下载,h5网页制作软件?
制作农业网站的软件,比较好的农业网站推荐一下?
如何基于云服务器快速搭建个人网站?
c++ stringstream用法详解_c++字符串与数字转换利器
如何在IIS服务器上快速部署高效网站?
如何快速搭建FTP站点实现文件共享?
建站主机选购指南:核心配置与性价比推荐解析
建站之星会员如何解锁更多建站功能?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何通过二级域名建站提升品牌影响力?
*请认真填写需求信息,我们会在24小时内与您取得联系。