① options 处理组件的配置项(分两步)
1.利用initInternalComponent函数,再initInternalComponent里创建新的对象,利用Object.create()继承vm.constructor.options原型vm.constructor.options上,将组件配置对象上的一些更深层次的属性放到了vm.$options选项中,以提高代码的执行效率。
2. resolveConstructorOptions函数,将Vue的全局配置到根组件的局部配置一起合并。
②initLifecycle ( vm ) 初始化组件实例关系属性,比如:children,refs
③initEvents ( vm ) 处理自定义实例
④initRender ( vm ) 解析组件的插槽信息,得到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.mount 方法,也就是说有了 el 选项,就不需要再手动调用 mount
接下来就是进入挂载阶段
Ps: 面试题
① <comp @click="handleClick" /> 上注册的事件,是父组件还是子组件监听?
是子组件本身,也就是说事件的派发和监听者都是子组件本身,和父组件无关。
②在初始化过程中,最早能拿到数据是在beforeCreate还是在created?
是在created里面,因为初始化在beforeCreate前都是在做合并组件配置项,优化配置项,处理组件实例的关系,处理自义定事件,还有解析插糟,在beforeCreate之后,才是处理数据,最早要到created中才能拿到初始化数据。