# 1、beforeCreate()

new Vue()之后触发的第一个钩子,在当前阶段data、methods、computed 以及 watch上的数据和方法都不能被访问。

# 2、created()

在实例创建完成后发生,当前阶段已经完成了数据的初始化,可以获取到data/$ref等属性,但是在这里更改数据不会触发updated函数。在当前阶段无法与 Dom 进行交互(获取不到$el),如果非要想,可以通过 vm.$nextTick 来访问 Dom。 在beforeCreate()created()钩子函数之前的数据初始化顺序是:

  • initInjections(vm)
  • initState(vm) 在这里按照 props,methods,data,computed,watch的顺序初始化数据。
  • initProvide(vm)

# 3、beforeMounted()

发生在挂载之前,在这之前 template 模板已导入渲染函数编译。而当前阶段虚拟Dom已经创建完成,即将开始渲染。在此时也可以对数据进行更改,不会触发updated

# 4、mounted()

在挂载完成后发生,在当前阶段,真实的 Dom 挂载完毕(数据编译完成),数据完成双向绑定,可以访问到Dom节点,使用$ref属性对Dom进行操作。

# 5、beforeUpdate()

发生在更新之前,也就是响应式数据发生更新,虚拟 dom 重新渲染之前被触发,你可以在当前阶段进行更改数据,不会造成重渲染。该钩子函数时在实例化Watch类时通过AOP 作为参数传入的。

new Watcher(vm, updateComponent, noop, {
    before () {
      if (vm._isMounted && !vm._isDestroyed) {
        callHook(vm, 'beforeUpdate')
      }
    }
  }, true /* isRenderWatcher */)
1
2
3
4
5
6
7

# 6、updated()

发生在更新完成之后,当前阶段组件 Dom 已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新。

# 7、beforeDestroy()

发生在实例销毁之前,在当前阶段实例完全可以被使用,我们可以在这时进行善后收尾工作,比如清除计时器、删除事件监听。

 beforeDestroy(){
     window.addEventListener('resize',this.resize);
     setINterval(this.timer)
 }
 //或者通过第二种方式

 this.$once("hook:beforeDestroy",()=>{
       window.addEventListener('resize',this.resize);
     setINterval(this.timer)
 }) 
1
2
3
4
5
6
7
8
9
10

# 8、destroyed()

发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例也统统被销毁。

几种不常用的钩子

# 9、activated()

keep-alive 组件激活时调用,该钩子在服务器端渲染期间不被调用。

# 10、deactivated()

keep-alive 组件停用时调用,该钩子在服务器端渲染期间不被调用。

# 11、errorCaptured()

当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

Last Updated: 9/14/2020, 12:20:49 PM