vue生命周期
vue生命周期分4个阶段,初始化阶段,模板编译阶段,挂载阶段,卸载阶段
1.一开始初始化阶段的_init()中
(1)通过initLeftcycle(vm)初始化私有的属性,例如$ref,$root,_watcher等等
(2)通过initEvents(vm)初始化事件,把组件标签注册的事件添加到事件系统中去,这个注册是事件是子组件通过emit抛出的事件,然后在父组件中接收注册的事件,并非是平台标签,如在div上注册的事件,这就是平台标签,这由浏览器来监控
(3)触发beforeCreate钩子函数
(4)通过initInjections(vm),初始化注入,inject和provide是成对出现,他们两个配合可以向所有的组件注入依赖,所有的组件都可以使用
(5)通过initState(vm),初始化状态,在这个时候,开始初始化按顺序prop,methods,data,computed,watch。在这之后才可以访问或使用这些数据
(6)通过initProvide(vm),初始化provide,把provide添加到vm._provide
(7)触发created钩子函数
(8)查看是否有el选项,如果有就执行vm.$mount(vm.$options.el),进入下一阶段,如果没有则不进入下一个阶段,等待手动执行vm.$mount
2.进入模板编译阶段,模板编译阶段处于created和beforeMount之间挂载阶段
(1)在完整版本才会进入编译阶段,主要是进行编译,生成渲染函数,先经过HTML解析器生成AST(抽象树),再经过优化器在AST树基础上进行静动态节点进行标记,最后再由代码生成器输出代码字符串,放到渲染函数中
(2)如果在只有运行时的版本中是不会有这个阶段,因为已经编译好了渲染函数,直接跳过进入挂载阶段了。
3.挂载阶段,挂载阶段在beforeMount到mounted之间
(1)触发beforeMount钩子函数
(2)进入挂载,new Wacther,在Wacther的回调函数中,运行_render函数,生成vnode,然后作为参数传给_update函数
(3)触发mounted钩子函数
当dom挂载之后,所依赖的数据发生了变化时,就会进行重新渲染
(1)当数据发生变化时,所依赖该数据的Watcher就会重新运行
(2)然后该Watcher就会被调度器添加到nextTick队列中,这个队列是微队列,这样可以避免多个依赖同时改变是被多次执行
(3)触发beforeUpdate函数
(4)在render函数执行的时候,会去掉之前的依赖,又开始重新收集依赖,生成新的dom树
(5)执行_update函数,会触发patch函数,进行新旧树比较更新,最后重新渲染
(6)调用updated函数
4.卸载阶段,处于beforeDestroy到destroyed之间
(1)当vm.$destroy()调用时,就进入卸载阶段
(2)调用beforeDestroy钩子函数
(3)对依赖列表,父子组件的关系,注册的事件进行卸载
(4)调用destroyed钩子函数