Vue源码之初始化过程笔记

85 阅读1分钟

① options 处理组件的配置项(分两步)

1.利用initInternalComponent函数,再initInternalComponent里创建新的对象,利用Object.create()继承vm.constructor.options原型vm.constructor.options上,将组件配置对象上的一些更深层次的属性放到了vm.$options选项中,以提高代码的执行效率。

2. resolveConstructorOptions函数,将Vue的全局配置到根组件的局部配置一起合并。

②initLifecycle ( vm ) 初始化组件实例关系属性,比如:parent,parent,children,root,root,refs

③initEvents ( vm ) 处理自定义实例

④initRender ( vm ) 解析组件的插槽信息,得到vm.slot,处理渲染函数,得到vm.slot,处理渲染函数,得到vm.createElement方法,既h函数

⑤callHook ( vm, 'beforeCreate' ) 调用beforeCreated钩子函数

⑥initInjections ( vm ) 初始化inject配置项,得到result[key] = val 形式的对象(自身provided上寻找,得到配置的就返回值)

⑦initState ( vm ) 数据响应式的重点,处理data, methods, props, watch,  computed

⑧initProvide ( vm ) 解析组件配置项的provided对象,将其挂载到vm._provided属性上

⑨callHook ( vm, 'created' ) 调用钩子函数created

⑩vm.options.el 如果发现配置项上有el选项,则自动调用options.el  如果发现配置项上有 el 选项,则自动调用 mount 方法,也就是说有了 el 选项,就不需要再手动调用 mount方法,反之,没提供el选项则必须调用mount 方法,反之,没提供 el 选项则必须调用 mount

接下来就是进入挂载阶段

Ps: 面试题 

① <comp @click="handleClick" /> 上注册的事件,是父组件还是子组件监听? 

是子组件本身,也就是说事件的派发和监听者都是子组件本身,和父组件无关。

②在初始化过程中,最早能拿到数据是在beforeCreate还是在created?

是在created里面,因为初始化在beforeCreate前都是在做合并组件配置项,优化配置项,处理组件实例的关系,处理自义定事件,还有解析插糟,在beforeCreate之后,才是处理数据,最早要到created中才能拿到初始化数据。