Skip to content

Latest commit

 

History

History
42 lines (22 loc) · 1.78 KB

2.生命周期钩子函数.md

File metadata and controls

42 lines (22 loc) · 1.78 KB
  • beforeCreate: 调用时获取不到props和data数据,因为数据的初始化都在initState中。

  • created: 能够访问props和data数据,但组件还没挂载

  • beforeMount:开始创建 VDOM

  • mount: 将 VDOM 渲染成真实的 DOM,并渲染数据。

    组件有子组件会递归挂载子组件,子组件都挂载完毕才会执行根组件挂载

  • beforeUpdate | updated:数据更新前后会触发

  • beforeDestroy | destroyed:组件销毁前后触发,beforeDestroy 适合移除事件和定时器

    有子组件会先销毁子组件

beforeCreated和created中间都做了什么

初始化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中shouldComponentUpdate的生命周期

根本原因是Vue和React的变化侦测方式不同。

React使用pull的方式侦测变化,当组件发生变化后,使用diff进行差异检测,但是很多组件实际上是没有变的,所以需要shouldComponentUpdate进行手动操作来减少diff,从而提高程序整体的性能.

Vue使用pull + push的方式侦测变化,一开始就知道哪个组件发生了变化,因此在push的阶段不需要手动控制diff。合理大小的组件不会产生过量diff,手动优化比较有限,所以组件没采用引入类似的生命周期