Vuex 核心属性(下)

Modules:可以定义新的模块

官方上说,当我们的应用变的非常复杂时,store对象就有可能变得相当臃肿

为了解决这个问题,Vuex允许我们将store分割成模块(Module),

在这里,每个模块都拥有自己的state、mutations、actions、getters等

 

写个例子吧:
首先我们来声明一个module,起个名字就叫做moduleA吧

const moduleA={ state:{}, mutations:{}, getters:{}, actions:{} } const store = new Vuex.Store({ state:{}, mutations:{}, actions:{}, getters:{}, modules:{ a:moduleA } })

从上面的代码可以得知, const store = new Vuex.Store({})  是根(root)

那么在const moduleA就是我们分离出去的模块了,下面我们在moduleA中的state写一条数据,看看它是如何被使用的

const moduleA = {
  state:{
   name:"张三"
  }  
}

const store = new Vuex.Store({
  modules:{
    a:moduleA
   }
})

在组件页面引用时,如App.vue页面中引用时,

<h1>{{$store.state.a.name}}</h1>

可以看到,我们调用的还是根的state,但是我们定义的a:moduleA ,将我们在moduleA中的state以a的形式给添加到了根的state中去,

所以我们要使用$store.state.a.name 来获取moduleA模块中state中的数据

在moduleA这模块中的getter可以有三个参数:

const moduleA = {
   getters:{
      fullName(state){
      //第一个参数:state==》指向当前模块中的state
      //返回内容是state中的name拼接上111
          return state.name + '111'
      },
   fullName2(state,getters){
//第二个参数:getters====》可以引用该模块中的其他gettes方法
//返回内容:先获取到fullName返回的内容再拼接上222
return getters.fullName + '222'
},
fullName3(state,getters,rootState){
//第三个参数rootState====>根上边的state
//返回内容:先获取到fullName2返回的内容再拼接上 根上边的state中的count
return getters.fullName2 + rootState.count
}
} }

 

在moduleA这模块中的actions中的参数context(上下文)指向问题

const moduleA = {
  actions:{
aUpdName(context){ //context: 上下文的意思 setTimeout(()=>{ //参数'UpdName' 是mutations中的方法名,李四:是传递去的参数 context.commit('UpdName','李四') //这里的context.commit()方法只提交给当前模块中的mutations中去,也就是说模块里的context指向模块中的mutation },1000) } } }

 对象结构:可以将context解构为state、commit、rootState,如下面的例子

const moduleA = {
  actions:{
//state ===> 指向当前模块中的state; commit===> 提交给当前模块中的mutation ; rootState===> 根上边的state属性 aUpdName({state、commit、rootState}){ if((state.count + rootState.count) % 2 === 1){
      commit('updName') //updName 当前模块中的mutation
} } } }

 

 

至于在moduleA这个分离出来的模块中mutations的使用方法,跟分离前是一样的

 

posted @ 2020-05-08 11:40  大云之下  阅读(154)  评论(0编辑  收藏  举报
大云之下