Vue生命周期
每个Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会
所有生命周期钩子的
this上下文将自动绑定至实例中,因此你可以访问 data、computed 和 methods。这意味着你不应该使用箭头函数来定义一个生命周期方法 (例如created: () => this.fetchTodos())。因为箭头函数绑定了父级上下文,所以this不会指向预期的组件实例,并且this.fetchTodos将会是 undefined。
Vue生命周期和详细的执行过程
从上图能很清楚的看出单个组件的生命周期:
挂载: beforeCreate => created => beforeMount => mounted
更新: beforeUpdate => updated
销毁: beforeDestroy => destroyed
选项 / 生命周期钩子
- beforeCreate
- 处理该实例的初始化选项
- 初始化生命周期
- 初始化事件
- 初始化render函数
-
Created
加载完成之前,执行。执行顺序:父组件-子组件 -
beforeMount
载入前(完成了data和el数据初始化),但是页面中的内容还是vue中的占位 符,data中的message信息没有被挂在到Bom节点中,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
- Mounted
- el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子
- 如果root实例挂在了一个文档内元素,当mounted被调用时,vm.$el也在文档内
- 该钩子在服务器端渲染期间不被调用
mounted: function () {
this.$nextTick(function () {
// 仅在整个视图都被渲染之后才会运行的代码
})
}
- beforeUpdate
- 数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器
- 数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前
- 可以在这个钩子中进一步的更改状态,这不会触发附加的重新渲染过程
- 该钩子在服务器端渲染期间不被调用
- Updated
在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用
当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
然而在大多数情况下,你应该避免在此期间更改状态。
如果要相应状态改变,通常最好使用计算属性或watcher取而代之。
updated: function () {
this.$nextTick(function () {
// 仅在整个视图都被重新渲染之后才会运行的代码
})
}
!!该钩子在服务器端渲染期间不被调用!!
- beforeDestory
- 实例销毁之前调用。在这一步,实例仍然完全可用
- 该钩子在服务器端渲染期间不被调用
运用场景:
场景一:离开当前路由,会直接调用
当前路由不使用缓存,离开当前路由会直接调用 beforeDestroy 和 beforeDestroy 销毁
情景二:离开当前路由,不会直接调用,需要程序控制调用
当前路由使用缓存,离开当前路由不会直接调用 beforeDestroy 和 beforeDestroy 销毁,需要使用路由钩子函数主动的调用
beforeLeave(to,from,next){
this.$destory();
next();
}
- Destoryed
- Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁
- 该钩子在服务器端渲染期间不被调用
destoryed(){
window.removeEventListen("resize",this.resizeWin)
}
Vue实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂在DOM、渲染-更新-渲染、卸载等一系列过程,我们成为Vue实例的生命周期,钩子就是在某个阶段给你一个做某些处理的机会