# 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 */)
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)
})
2
3
4
5
6
7
8
9
10
# 8、destroyed()
发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例也统统被销毁。
几种不常用的钩子
# 9、activated()
在 keep-alive 组件激活时调用,该钩子在服务器端渲染期间不被调用。
# 10、deactivated()
在 keep-alive 组件停用时调用,该钩子在服务器端渲染期间不被调用。
# 11、errorCaptured()
当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。