当前位置: 首页 > news >正文

Vue基础(21)_Vue生命周期

目录

Vue生命周期:

挂载流程

更新流程

销毁流程

生命周期图示


实例生命周期钩子

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

Vue生命周期:

1、又名:生命周期回调函数、生命周期函数、生命周期钩子
2、是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
3、生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
4、生命周期函数中的this指向vm组件实例对象。 

vm的一生(vm的生命周期):

将要创建  ===>  调用beforeCreate函数。
创建完毕  ===>  调用created函数。

将要挂载  ===>  调用beforeMount函数。
挂载完毕  ===>  调用mounted函数。

将要更新  ===>  调用beforeUpdate函数。
更新完毕  ===>  调用updated函数。

将要销毁  ===>  调用beforeDestroy函数。
销毁完毕  ===>  调用destroyed函数。

常用的生命周期钩子:

1、mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
2、beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。

关于销毁Vue实例:

1、销毁后借助Vue开发者工具看不到任何信息。
2、销毁后自定义事件会失效,但原生DOM事件依然有效。
3、一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

vm.$destroy()

用法:
1、完全销毁一个实例。清理它与其它实例【组件实例对象】的连接,解绑它【vm】的全部指令及事件监听器
2、触发 beforeDestroydestroyed 的钩子。
3、在大多数场景中你不应该调用这个方法。最好使用 v-if v-for 指令以数据驱动的方式控制子组件的生命周期。

挂载流程

Vue生命周期图示(1):

验证一:在beforeCreate函数内卡一个断点:

            // 在数据监测、数据代理创建之前。// 此时:无法通过vm访问到data中的数据、method中的方法。beforeCreate() {console.log('beforeCreate');console.log(this);debugger}

验证二:在created函数内卡一个断点:

            // 数据监测、数据代理创建完毕。// 此时:可以通过vm访问到data中的数据、methods中配置的方法。created() {console.log('Created');console.log(this);debugger}

Vue生命周期图示(2):

验证三:在beforeMount函数内卡一个断点:

            // 页面呈现的是未经Vue编译的DOM结构。// 所有对DOM的操作,最终都不奏效(此时虚拟DOM已经生成,即将转为真实DOM,在此操作DOM,生效后会马上失效)。beforeMount() {console.log('beforeMount');console.log(this)debugger}

Vue生命周期图示(3):

验证四:在mounted函数内卡一个断点:

            // 页面呈现的是经过Vue编译的DOM结构。此时对DOM的操作均有效(尽可能避免)。// 至此初始化过程结束,一般在此进行:开启定时器、发送网路请求、订阅消息、绑定自定义事件、等初始化操作。mounted() {console.log('mounted');this.timer = setInterval(() => {this.opacity -= 0.01;if (this.opacity <= 0)this.opacity = 1;}, 16)debugger},

更新流程

Vue生命周期图示(4):

验证五:关闭定时器函数,在beforeUpdate函数内卡一个断点:

            // 此时:数据是新的,但页面是旧的,还没来得及更新。即:页面未和数据保持同步。beforeUpdate() {console.log('beforeUpdate');console.log(this.n);debugger}

点击按钮后,beforeUpdate函数调用,控制面板n值为2,但页面还没来得及更新,n值仍然为1:

验证六:关闭定时器函数,在updated函数内卡一个断点:

            // 此时:数据是新的,页面也是新的,即:页面和数据保持同步。updated() {console.log('updated');console.log(this.n);debugger;}

点击按钮后,updated函数调用,控制面板n值为2,n值更新为2:

销毁流程

Vue生命周期图示(5):

验证七:关闭定时器函数,在beforeDestroy函数内卡一个断点:

            // 此时:vm中所有的:data、method、指令等,都处于可用状态,马上要执行销毁过程。// 此时:数据能访问,修改,方法能调用。但是对数据的修改不再触发更新。// 一般在此阶段:关闭定时器、取消订阅消息、解绑自定义事件等收尾操作。beforeDestroy() {console.log('beforeDestroy');// 方法能调用,n值增加,但是n值不能触发数据更新了。this.add();console.log(this.n);// clearInterval(this.timer)debugger}

点 "点我n+1" 按钮后,n值为2。

点击 "停止演示" 按钮后,vm即将销毁,此时调用了add方法,n值为3,但页面仍然显示2。

最后,destroyed函数调用后,vm销毁。。以上整个过程就是vue的生命周期(还剩3个钩子涉及路由,后续将补充)。

代码示例:

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8"><script type="text/javascript" src="../js/vue.js"></script><title>生命周期</title>
</head><body><div id="root"><!-- ES6增强写法 opacity = opacity 简写为 opacity --><h3 :style="{opacity}" style="color: chocolate;">Vue生命周期演示</h3><button @click=stop>停止演示</button><button @click='opacity = 1'>透明度设置为1</button><h3>当前的n值是:{{n}}</h3><button @click=add>点我n+1</button></div><script>new Vue({el: '#root',// template配置项内的内容,不换行可以用'',换行则需要用es6里的模板字符串``// template配置项内指定的是模板语句,只能有一个根节点。// 使用template配置项,指定挂载位置的元素会被替换template: ` <div><h3 :style="{opacity}" style="color: chocolate;">Vue生命周期演示</h3><button @click=stop>停止演示</button><button @click='opacity = 1'>设置透明度为1</button><h3>当前的n值是:{{n}}</h3><button @click=add>点我n+1</button></div>`,data: {n: 1,opacity: 1,timer: ''},methods: {add() {this.n++;},stop() {// 更加暴力。直接进入vm的善后工作,vm代码进入收尾阶段,统一销毁,流程更方便。this.$destroy();// 更加温柔。可以进行其他按钮操作,比如 设置透明度等。。// clearInterval(this.timer);}},// 在数据监测、数据代理创建之前。// 此时:无法通过vm访问到data中的数据、method中的方法。beforeCreate() {console.log('beforeCreate');console.log(this);},// 数据监测、数据代理创建完毕。// 此时:可以通过vm访问到data中的数据、methods中配置的方法。created() {console.log('Created');console.log(this);},// 页面呈现的是未经Vue编译的DOM结构。// 所有对DOM的操作,最终都不奏效(此时虚拟DOM已经生成,即将转为真实DOM,在此操作DOM,生效后会马上失效)。beforeMount() {console.log('beforeMount');console.log(this)},// 页面呈现的是经过Vue编译的DOM结构。此时对DOM的操作均有效(尽可能避免)。// 至此初始化过程结束,一般在此进行:开启定时器、发送网路请求、订阅消息、绑定自定义事件、等初始化操作。mounted() {console.log('mounted');// this.timer = setInterval(() => {//     this.opacity -= 0.01;//     if (this.opacity <= 0)//         this.opacity = 1;// }, 16)       },// 此时:数据是新的,但页面是旧的,还没来得及更新。即:页面未和数据保持同步。beforeUpdate() {console.log('beforeUpdate');console.log(this.n);},// 此时:数据是新的,页面也是新的,即:页面和数据保持同步。updated() {console.log('updated');console.log(this.n);},// 此时:vm中所有的:data、method、指令等,都处于可用状态,马上要执行销毁过程。// 此时:数据能访问,修改,方法能调用。但是对数据的修改不再触发更新。// 一般在此阶段:关闭定时器、取消订阅消息、解绑自定义事件等收尾操作。beforeDestroy() {console.log('beforeDestroy');// 方法能调用,n值增加,但是n值不能触发数据更新了。this.add();console.log(this.n);// clearInterval(this.timer)},destroyed() {console.log('destroyed');},})</script>
</body></html>

生命周期图示

http://www.dtcms.com/a/289240.html

相关文章:

  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户注册实现
  • 《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
  • 力扣49:字母异形词分组
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • 下载win10的方法
  • 构建一个简单的Java框架来测量并发执行任务的时间
  • Linux安装jdk和maven教程
  • 论文解读:基于时域相干累积的UWB Radar 生命体征检测
  • PyTorch里的张量及张量的操作
  • The FastMCP Client
  • 反欺诈业务 Elasticsearch 分页与导出问题分析及解决方案
  • Kotlin函数式接口
  • 第六章 提炼:萃取本质--创建第二大脑读书笔记
  • 【esp32s3】4 - 从零开始入门 MQTT
  • Selenium 处理动态网页与等待机制详解
  • 谷歌开源项目MCP Toolbox for Databases实操:Docker一键部署与配置指南
  • zabbix服务器告警处理
  • 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)
  • Web服务压力测试工具hey学习一:使用方法
  • seo优化
  • UE5多人MOBA+GAS 番外篇:移植Lyra的伤害特效(没用GameplayCue,因为我失败了┭┮﹏┭┮)
  • 均值漂移累积监测算法(MDAM):原理、命名、用途及实现
  • C++现代编程之旅:从基础语法到高性能应用开发
  • JavaScript 对象操作、继承与模块化实现
  • 深度学习图像分类数据集—八种贝类海鲜食物分类
  • UDP中的单播,多播,广播(代码实现)
  • #SVA语法滴水穿石# (014)关于链式蕴含的陷阱
  • python生成密钥
  • FreeSwitch编译部署
  • 去中心化协作智能生态系统