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._children
removeChild
删除子模块getChild
获取子模块update
在 ModuleCollection
的 update
的调用,负责整个模块的更新后面的几个方法都是调用
forEachValue
,将对应对应的模块,以及传入的 fn
传入。getNamespace
根据
path
处理命名空间:- 作者:张小手
- 链接:https://zxs-1024.cn/article/vue-class
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。