-
beforeCreate: 调用时获取不到props和data数据,因为数据的初始化都在initState中。
-
created: 能够访问props和data数据,但组件还没挂载
-
beforeMount:开始创建 VDOM
-
mount: 将 VDOM 渲染成真实的 DOM,并渲染数据。
组件有子组件会递归挂载子组件,子组件都挂载完毕才会执行根组件挂载
-
beforeUpdate | updated:数据更新前后会触发
-
beforeDestroy | destroyed:组件销毁前后触发,beforeDestroy 适合移除事件和定时器
有子组件会先销毁子组件
初始化data、props、computed、watcher、provide
官方源码地址:src/core/instance/init.js
callHook(vm, 'beforeCreate')
initInjections(vm) // resolve injections before data/props
initState(vm)
initProvide(vm) // resolve provide after data/props
callHook(vm, 'created')
核心实现是利用发布订阅模式先将用户传入的生命周期钩子订阅好,然后在创建组件实例的过程中会依次执行对应的钩子方法(发布)
根本原因是Vue和React的变化侦测方式不同。
React使用pull的方式侦测变化,当组件发生变化后,使用diff进行差异检测,但是很多组件实际上是没有变的,所以需要shouldComponentUpdate进行手动操作来减少diff,从而提高程序整体的性能.
Vue使用pull + push的方式侦测变化,一开始就知道哪个组件发生了变化,因此在push的阶段不需要手动控制diff。合理大小的组件不会产生过量diff,手动优化比较有限,所以组件没采用引入类似的生命周期