this._init
截取其中部分代码可以看到 beforeCreate之前
初始化了$options及实例上的一些默认属性和默认值
以及最重要initRender函数;
其中,使用defineReactive 将 '$attrs','$listeners'进行处理响应式处理
(官网截图)
inject/provide
注入一个依赖
从 图一 可以看出先
先处理 inject initInjections
再处理 data/props initState
最后才是处理 provide initProvide
这个顺序保证了当有当前实例和父类元素注入属性有冲突时,以当前实例的属性为准的规则
initInjections 中可以看到
toggleObserving 将 inject上的属性不会进行响应式处理
data/props
initProps
执行defineReactive函数,初始化 props参数,即赋值和数据绑定
initMethods
绑定 方法至this 实例,可以看到如果props和methods存在同名属性,测试环境下会警告,同时methods必须是函数
initData
这里可以看到,如果使用 function 形式的 data ,那么就是 data.bind(this,this)();
在之前设定 $options 时
如果时对象形式,那么则这个组件创建的所有实例共用一个数据对象
测试环境,通过模板.vue文件,data 如果不是function形式会报错
initComputed
创建一个观察者,同时将定义的属性通过原生的Object.defineProperty赋值到实例上,故我们获取数据的时候,实际上就是调用 Object.defineProperty的get函数,同时也可以通过set 写入
initWatch
多种使用方式
接下来是 执行 created生命钩子函数
最后执行 mouted 操作
如果存在虚拟dom元素,则会进行$mouted渲染操作