Vue2生命周期

189 阅读1分钟

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),初始化状态,在这个时候,开始初始化按顺序propmethodsdatacomputedwatch。在这之后才可以访问或使用这些数据

(6)通过initProvide(vm),初始化provide,把provide添加到vm._provide

(7)触发created钩子函数

(8)查看是否有el选项,如果有就执行vm.$mount(vm.$options.el),进入下一阶段,如果没有则不进入下一个阶段,等待手动执行vm.$mount

2.进入模板编译阶段,模板编译阶段处于createdbeforeMount之间挂载阶段

(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钩子函数