type
status
date
slug
summary
tags
category
icon
password

class ModuleCollection

在上面初始参数的赋值中 this._modules 就是 ModuleCollection 类的实例。
如果没有嵌套模块,this._modules 是这样一个结构。
来看看 ModuleCollection:
ModuleCollection 类的 constructor 中首先会执行类的 register 方法,将空数组、rawRootModule(也就是实例化的时候传入的 options)、false 最为最初参数传入。
register 方法会递归调用,实现嵌套模块的收集 首先会在非生产环境调用 assertRawModule 函数,对 module 进行一些断言判断,判断 rawModule 对象是否有 getters mutations mutationskey 值,然后根据预置的类型进行断言。
随后就是实例化 Module 新建一个 newModule,判断 path.length,0 说明是 root, 将 newModule 保存到 this.root 上,然后判断 rawModule.modules 是否有嵌套 modules
有就调用 forEachValuemodules转换成数组,并且循环调用传入的回调函数,回调函数里又递归调用了 this.register,将 path 合并子模块的 key, 循环的子模块、runtime 作为参数传入。
第二次进入 register 会进入 else 判断,调用 Module 类的 getChild addChild, 建立 module 的父子关系,如果仍然嵌套模块继续递归调用 this.register
forEachValue

assertRawModule

上面说过,assertRawModule 负责对 module 进行一些断言判断,判断 rawModule 对象是否有 gettersmutationsmutationskey 值,然后根据预置的类型进行断言。
assertRawModule 循环 assertTypes 对象,循环的 keygetters mutations actions,判断传入模块是否有这些属性。
接着从 assertTypes 取出对应属性的 value
循环 rawModule[key] 对象,如果 key 此时就是 getters,那就是遍历当前模块有所的 getter 函数,回调函数是一个断言函数,assertOptionsassert 会返回对属性类型的判断,作为 Boolean 传入,makeAssertionMessage 函数只是对断言函数判断的异常的描述。

class Module

来看看 Module 类的代码:
Module 类的 constructor 中会将传入的 rawModule runtime 保存,申明 this._children,主要是存放该模块的子模块,将 rawModule.state 取出保存到 this.state 上。
Module 类提供了很多方法:
namespaced 通过双非取值返回一个 布尔值 ,作为是否有命名空间的判断。
addChildModuleCollectionregister 方法中调用,将子模块存入到父模块的 this._children
removeChild 删除子模块
getChild 获取子模块
updateModuleCollectionupdate 的调用,负责整个模块的更新
后面的几个方法都是调用 forEachValue,将对应对应的模块,以及传入的 fn 传入。

getNamespace

根据 path 处理命名空间:
 
vue 更舒适的开发环境vuex-devtool
张小手
张小手
一个普通的干饭人🍚