文章目录
- 生命周期
- 定义
- 流程
- 常用的生命周期钩子
- 关于销毁Vue实例
生命周期
定义
生命周期,又名生命周期回调函数、生命周期函数或生命周期钩子,是Vue在关键时刻调用的一些特殊函数。生命周期函数名称不可更改,但是函数内容可以根据需求进行编写。生命周期函数中的this指向vm或组件实例对象。
流程
new Vue()
初始化流程
- . 初始化生命周期和事件,但数据代理还未开始
- 调用beforeCreate方法(创建之前),此时无法通过vm访问data中的数据、methods中的方法
- 初始化数据监视、数据代理
- 调用created方法,此时可以通过vm访问data中的数据、methods中的方法
- 解析模板,生成虚拟DOM,页面还不能显示解析好的内容
- 调用beforeMount方法,此时页面呈现的是未经Vue编译的DOM结构,所有对DOM操作【最终】都不生效
- 将内存中的 虚拟DOM 转成 真实DOM 并渲染到页面
- 调用mounted方法,页面渲染Vue编译之后的DOM结构,对DOM的操作有效(尽量避免),初始化过程结束,一般在此进行开启定时器、发送网络请求、订阅消息、绑定自定义事件等初始化操作
更新流程(数据改变时)
- 调用beforeUpdate,数据是新的,页面是旧的,页面和数据尚未保持同步
- 根据新数据,生成新的虚拟DOM,随后与旧的虚拟DOM进行比较,最终完成页面更新,既完成Model → View的更新
- 调用updated,数据和页面都是新的,页面和数据同步
销毁流程
- 调用vm.$destroy,完全销毁一个实例,解绑vm上的指令及事件监听器(自定义事件)
- 调用beforeDestroy,vm中的data、methods、指令等,都处于可用状态,一般在此阶段执行关闭定时器、取消订阅消息和解绑自定义事件等操作
- 移除所有的监视、子组件和事件监听器(自定义事件)
- 调用destroy,销毁vm
常用的生命周期钩子
mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等初始化操作
beforeDestroy:清除定时器、解绑自定义事件、取消消息订阅等收尾工作
关于销毁Vue实例
- 销毁后借助Vue开发者工具看不到任何信息
- 销毁后自定义事件会失效,但元素DOM事件不会
- 一般不会再beforeDestroy钩子中操作数据,因为即便操作数据,也不会在触发更新流程
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue</h2>
<button @click="stop">停止</button>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
// 创建Vue实例
new Vue({
el: '#root', // el用于定义当前Vue实例为哪个容器服务,值通常为css选择器
data:{
opacity: 1
},
methods: {
stop() {
this.$destroy();
}
},
// Vue完成模板解析并把初始真实dom渲染到页面后调用
mounted() {
this.timer = setInterval(() => {
this.opacity -= 0.01;
if (this.opacity <= 0) this.opacity = 1
}, 30);
},
beforeDestroy() {
clearInterval(this.timer);
},
});
// 通过外部方法实现(不推荐)
// setInterval(() => {
// vm.opacity -= 0.01;
// if (vm.opacity <= 0) vm.opacity = 1
// }, 16);
</script>