在上一節中,咱們已經實現了模塊的收集功能,如今就差咱們的最後一步,安裝模塊...javascript
把子模塊中全部的getters/mutations/actions
所有安裝到store
中的state/getters/mutations/actions
java
那麼,咱們來實現一下,這個安裝函數數組
state
安裝到root module
時,會用到state
,雖然咱們能夠經過store.state
方式進行訪問,但爲了方便起見,這裏仍是直接以參數傳入。 由此,咱們肯定了函數須要要傳入的參數。mutations
和actions
來講,可能存在重名的狀況,因此咱們使用數組進行存儲,即把同名屬性放到數組中const installModule = (store,state,path,rootModule)=>{
if(path.length){
let parent = path.slice(0,-1).reduce((state,current)=>{
return state[current]
},state)
// 將state 轉變成響應式
Vue.set(parent,path[path.length-1],rootModule.state)
}
let getters = rootModule.raw.getters
if(getters){
forEach(getters,(key,fn)=>{
Obejct.defineProperty(store.getters,key,{
get:()=>{
return fn(rootModule.state)
}
})
})
}
let mutations = rootModule.raw.mutations
if(mutations){
forEach(mutations,(key,fn)=>{
let arr = store.mutations[key]||(store.mutations[key]=[])
arr.push((payload)=>{
fn(store.state,payload)
})
})
}
let actions = rootModule.raw.actions
if(actions){
forEach(actions,(key,fn)=>{
let arr = store.actions[key]||(store.actions[key]=[])
arr.push((payload)=>{
fn(store,payload)
})
})
}
forEach(rootModule.children,(moduleName,module)=>{
installModule(store,state,path.concat(moduleName),module)
})
}
複製代碼
由於store.mutaions[key]可能時一個數組,因此,咱們要修改咱們的commit
函數。函數
commit(mutationType,paylod){
this.mutations[mutationType].forEach(fn=>fn(payload))
}
複製代碼
同理,對於dispatch
方法也應該做相同處理ui
dispatch(actionType,paylod){
this.actions[actionType].forEach(fn=>fn(payload))
}
複製代碼
完結撒花.... 完整代碼:this