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 mutations 为 key 值,然后根据预置的类型进行断言。随后就是实例化
Module 新建一个 newModule,判断 path.length,0 说明是 root, 将 newModule 保存到 this.root 上,然后判断 rawModule.modules 是否有嵌套 modules。有就调用
forEachValue 将 modules转换成数组,并且循环调用传入的回调函数,回调函数里又递归调用了 this.register,将 path 合并子模块的 key, 循环的子模块、runtime 作为参数传入。第二次进入
register 会进入 else 判断,调用 Module 类的 getChild addChild, 建立 module 的父子关系,如果仍然嵌套模块继续递归调用 this.register。forEachValue:assertRawModule
上面说过,
assertRawModule 负责对 module 进行一些断言判断,判断 rawModule 对象是否有 getters、mutations、mutations 为 key 值,然后根据预置的类型进行断言。assertRawModule 循环 assertTypes 对象,循环的 key 为 getters mutations actions,判断传入模块是否有这些属性。接着从
assertTypes 取出对应属性的 value循环
rawModule[key] 对象,如果 key 此时就是 getters,那就是遍历当前模块有所的 getter 函数,回调函数是一个断言函数,assertOptions 的 assert 会返回对属性类型的判断,作为 Boolean 传入,makeAssertionMessage 函数只是对断言函数判断的异常的描述。class Module
来看看
Module 类的代码:Module 类的 constructor 中会将传入的 rawModule runtime 保存,申明 this._children,主要是存放该模块的子模块,将 rawModule.state 取出保存到 this.state 上。Module 类提供了很多方法:namespaced 通过双非取值返回一个 布尔值 ,作为是否有命名空间的判断。addChild 在 ModuleCollection 的 register 方法中调用,将子模块存入到父模块的 this._childrenremoveChild 删除子模块getChild 获取子模块update 在 ModuleCollection 的 update 的调用,负责整个模块的更新后面的几个方法都是调用
forEachValue,将对应对应的模块,以及传入的 fn 传入。getNamespace
根据
path 处理命名空间:- 作者:张小手
- 链接:https://zxs-1024.cn/article/vue-class
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。