文章目录
- 引出生命周期
- 外部的定时器实现
- 生命周期实现
- 生命周期详解
- 挂载流程
- 更新流程
- 销毁流程
- 总结
Vue学习目录
上一篇:(十七)Vue之自定义指令
引出生命周期
先看一个需求:一上来就让一段文字的透明度循环从1-0-1的过程,效果是让一段文字逐渐透明直到透明的为0,为0时把透明度设置为1继续逐渐透明。
外部的定时器实现
<!-- 准备好一个容器-->
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue</h2>
</div>
const vm = new Vue({
el:'#root',
data:{
opacity:1
},
})
setInterval(()=>{
vm.opacity -= 0.01
if (vm.opacity <= 0){
vm.opacity = 1
}
},20)
通过外部的定时器实现(不推荐)
弊端:在实际开发中实例Vue是不会收到一个vm的,
- 一来是占用内存,影响效率。
- 二来一般对属性的修改都在Vue里面配置,想要在外面修改一般都是借助Vue.的形式设置。
生命周期实现
通过外部的定时器实现是不推荐,然而在内部修改属性,以我们的知识只能借助计算属性和methods配置,这两个配置都需要在模板里面使用才会生效,我们的需求是一上来就让其运行。
- methods配置需要事件触发才能实现需求,违背需求。
- 计算属性配置需要在模板里面使用,但是这样会开启很多个定时器,虽然能实现需求,但是这样会导致定时器溢出。
- 并且这两种方法都没有做关闭定时器这个动作。
综上所述,我们只能借助生命周期实现。
生命周期:
又名:生命周期回调函数、生命周期函数、生命周期钩子。
Vue在关键时刻帮我们调用的一些特殊名称的函数。
生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
生命周期函数中的this指向是vm 或 组件实例对象。
<div id="root">
<h2 :style="{opacity}">欢迎学习Vue</h2>
<button @click="stop">点我停止变换</button>
</div>
new Vue({
el:'#root',
data:{
opacity:1
},
methods:{
stop(){
//clearInterval(this.timer)
this.$destroy()
}
},
mounted(){
this.timer = setInterval(() => {
console.log('setInterval')
this.opacity -= 0.01
if(this.opacity <= 0) this.opacity = 1
},20)
},
beforeDestroy() {
clearInterval(this.timer)
}
})
生命周期详解
挂载流程
- 1 初始化生命周期和事件,但这时数据代理还未开始。
- 2 在初始化数据之前,调用beforeCreate钩子函数,此时无法访问到data的数据和methods中的方法
- 3 初始化数据监测和数据代理
- 4 创建完毕,调用created钩子函数,此时可以访问到data的数据和methods中的方法
- 5 是否有el配置项
- 5.1 有el配置项,走template配置项判断流程
- 5.2 没有el配置项,监测什么时候调用$mount(el),调用则走template配置项判断流程
- 6 判断是否有 template配置项
- 6.1 有template配置项,编译template并将函数绑定
- 6.2 没有template配置项,编译el所绑定的模板
- 7 将要挂载,调用beforeMount钩子函数,此时页面呈现未经Vue编译的DOM结构,所有对DOM的操作都无效
- 8 将内存中的虚拟DOM转换成真实DOM插入页面。
- 9 挂载完毕(重要),调用mounted函数函数,此时页面的是经过Vue编译的DOM,对DOM的操作均有效,但是要尽可能避免,至此初始化过程结束,一般在此过程进行:开启定时器、发送网络请求等初始化操作
更新流程
- 1 监测data数据什么时候改变
- 2 一旦data改变,将要更新,调用beforeUpdate钩子函数,此时数据是最新的,但是页面数据是旧的
- 3 根据新的数据生成新的虚拟DOM,通过diff算法与旧的DOM进行比较,最终完成更新
- 4 更新完毕,调用updated钩子函数,此时数据是最新的,页面也是最新的
注意:更新流程是循环的,即更新完,会进行监测data数据,一旦改变,就继续走更新流程,直到Vue走销毁流程。
销毁流程
- 1 监测什么时候调用$destroy()
- 2 将要销毁(重要),调用beforeDestroy钩子函数,此时Vue中的所有都处于可用状态,马上要执行销毁过程,一般在此时进行:关闭定时器、取消订阅消息等等收尾的操作
- 3 对Vue中所有的东西都进行销毁
- 4 销毁完毕,调用destroyed钩子函数,此时Vue中的所有东西都已经销毁,不可用
总结
挂载流程,更新流程、销毁流程
挂载流程
- 将要创建:调用beforeCreate函数
- 创建完毕:调用created函数
- 将要挂载:调用beforeMount函数
- 挂载完毕(重要):调用mounted函数
更新流程
- 将要更新:调用beforeUpdate函数
- 更新完毕:调用updated函数
销毁流程
- 将要销毁(重要):调用beforeDestroy函数
- 销毁完毕:调用destroyed函数
常用的生命周期钩子:
- 1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
- 2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。
关于销毁Vue实例
- 1.销毁后借助Vue开发者工具看不到任何信息。
- 2.销毁后自定义事件会失效,在vue版本2.6原生DOM事件依然有效,但在vue2.7原生的DOM事件也失效了。
- 3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。