【Vue】扫盲(五)Vue 的生命周期与钩子函数详解

news2024/10/11 14:35:44

【Vue】Vue扫盲(一)事件标签、事件修饰符:@click.prevent @click.stop @click.stop.prevent、按键修饰符、及常用指令

【Vue】Vue扫盲(二)指令:v-for 、v-if、v-else-if、v-else、v-show

【Vue】Vue扫盲(三)计算属性和监听器

【Vue】Vue扫盲(四)组件化思想与简单应用

文章目录

    • 一、Vue 生命周期概述
      • 1.Vue 生命周期概述
      • 2.主要的生命周期钩子函数
    • 二、主要的生命周期钩子函数
      • beforeCreate
      • created
      • beforeMount
      • mounted
      • beforeUpdate
      • updated
      • beforeDestroy
      • destroyed
    • 三、实际应用场景
      • 一、数据获取与初始化
        • 1.从服务器获取数据
        • 2.初始化组件数据
      • 二、DOM 操作相关
        • 1.操作挂载后的 DOM 元素
        • 2.第三方插件或库的初始化
      • 三、响应数据变化与性能优化
        • 1.数据更新时的额外操作
        • 2.处理复杂的计算属性更新
      • 四、资源清理与内存管理
        • 1.定时器与事件监听器的清除
        • 2.取消异步操作
    • 四、总结

在 Vue.js 开发中,理解生命周期和钩子函数是非常重要的。它们允许我们在不同阶段对组件进行特定的操作,从而实现更加灵活和强大的应用。
每个 Vue 实例在被创建时都要经过一系列的初始化过程 : 创建实例, 装载模板, 渲染模
板等等。 Vue 为生命周期中的每个状态都设置了钩子函数(监听函数) 。 每当 Vue 实例处于
不同的生命周期时, 对应的函数就会被触发调用

一、Vue 生命周期概述

Vue 实例在创建和运行过程中会经历一系列的阶段,每个阶段都有相应的钩子函数可以让我们在特定时刻执行自定义的逻辑。Vue 的生命周期大致可以分为以下几个阶段:

1.Vue 生命周期概述

  • 创建阶段:在这个阶段,Vue 实例被初始化,包括数据观测、事件绑定等操作。
  • 挂载阶段:Vue 实例被挂载到 DOM 上,此时可以访问到 DOM 元素。
  • 更新阶段:当数据发生变化时,Vue 会重新渲染组件,触发更新阶段的钩子函数。
  • 销毁阶段:当组件被销毁时,会执行一些清理操作,如解绑事件、移除 DOM 元素等。

2.主要的生命周期钩子函数

主要的生命周期钩子函数

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • beforeDestroy
  • destroyed

真正的执行顺序:在 Vue 实例的生命周期中,钩子函数执行的顺序
创建阶段

  • beforeCreate:首先执行这个钩子函数。此时,Vue 实例刚刚被初始化,数据观测(data observer)和事件机制还未被设置,无法访问到data、computed、methods等实例属性。
  • created:在beforeCreate之后执行。实例已经完成了数据观测、属性和方法的运算,初始化事件,此时可以访问data中的数据,也可以调用methods中的方法,但此时还未开始挂载到
    DOM。

挂载阶段

  • beforeMount:在创建完成之后、挂载开始之前被调用。此时,模板已经编译好了,但还没有挂载到真实的 DOM 上,el属性还未被替换成真实的 DOM 元素。
  • mounted:在beforeMount之后执行。实例已经挂载到真实的 DOM 上,可以通过this.$el访问到挂载后的 DOM 元素。通常在这个钩子函数中进行一些 DOM 操作,如获取 DOM 元素的高度、宽度等。

更新阶段(当数据发生变化时触发)

  • beforeUpdate:数据更新时,在虚拟 DOM 重新渲染和打补丁之前被调用。可以在这个钩子中进一步地更改状态,但不会触发额外的重新渲染循环。
  • updated:在虚拟 DOM 重新渲染和打补丁之后被调用。此时,DOM 已经根据数据的变化更新完毕,可以执行依赖于更新后的 DOM 的操作。

销毁阶段

  • beforeDestroy:在实例销毁之前被调用。此时实例仍然完全可用,可以在这个钩子函数中进行一些清理工作,如清除定时器、解绑自定义事件监听器等。
  • destroyed:在beforeDestroy之后执行。此时,Vue 实例的所有绑定(如指令绑定、事件监听器等)都已经被解除,子实例也被销毁,实例相关的所有东西都被拆除。

在这里插入图片描述

二、主要的生命周期钩子函数

beforeCreate

beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。此时,实例的选项对象还没有被解析,无法访问data、computed、watch等属性。

   new Vue({
     beforeCreate() {
       console.log('beforeCreate');
     },
     data() {
       return {
         message: 'Hello Vue!'
       };
     }
   });

created

created:在实例创建完成后被立即调用。此时,实例已经完成了数据观测、事件配置和方法的初始化,可以访问data、computed、watch等属性,但 DOM 还未被挂载。

   new Vue({
     created() {
       console.log('created');
       console.log(this.message); // 可以访问到 data 中的属性
     },
     data() {
       return {
         message: 'Hello Vue!'
       };
     }
   });

beforeMount

beforeMount:在挂载开始之前被调用。此时,模板已经编译完成,但还未被渲染到 DOM 中。

 new Vue({
     beforeMount() {
       console.log('beforeMount');
     },
     template: '<div>{{ message }}</div>',
     data() {
       return {
         message: 'Hello Vue!'
       };
     }
   });

mounted

mounted:在挂载完成后被调用。此时,实例已经被挂载到 DOM 上,可以访问到 DOM 元素。

 new Vue({
     mounted() {
       console.log('mounted');
       const div = document.querySelector('div');
       console.log(div.textContent); // 输出 'Hello Vue!'
     },
     template: '<div>{{ message }}</div>',
     data() {
       return {
         message: 'Hello Vue!'
       };
     }
   });

beforeUpdate

beforeUpdate:在数据更新时,但在虚拟 DOM 重新渲染和打补丁之前被调用。可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

new Vue({
     data() {
       return {
         count: 0
       };
     },
     beforeUpdate() {
       console.log('beforeUpdate');
     },
     template: '<div>{{ count }}</div>',
     methods: {
       increment() {
         this.count++;
       }
     }
   });

updated

updated:在数据更新之后,虚拟 DOM 重新渲染和打补丁之后被调用。此时,组件的 DOM 已经更新,可以执行依赖于 DOM 的操作。

  new Vue({
     data() {
       return {
         count: 0
       };
     },
     updated() {
       console.log('updated');
     },
     template: '<div>{{ count }}</div>',
     methods: {
       increment() {
         this.count++;
       }
     }
   });

beforeDestroy

beforeDestroy:在实例销毁之前被调用。在这个阶段,实例仍然完全可用,可以执行一些清理操作,如解绑事件、清除定时器等。

 new Vue({
     beforeDestroy() {
       console.log('beforeDestroy');
       // 清除定时器
       clearInterval(this.timer);
     },
     data() {
       return {
         message: 'Hello Vue!'
       };
     },
     created() {
       // 设置定时器
       this.timer = setInterval(() => {
         console.log('Timer is running.');
       }, 1000);
     }
   });

destroyed

destroyed:在实例销毁之后被调用。此时,实例的所有绑定和事件监听器都已被移除,子实例也都被销毁。

 new Vue({
     destroyed() {
       console.log('destroyed');
     },
     data() {
       return {
         message: 'Hello Vue!'
       };
     },
     created() {
       // 设置定时器
       this.timer = setInterval(() => {
         console.log('Timer is running.');
       }, 1000);
     },
     beforeDestroy() {
       clearInterval(this.timer);
     }
   });

三、实际应用场景

一、数据获取与初始化

1.从服务器获取数据

在created钩子函数中,由于实例已经完成了数据观测、事件配置和方法的初始化,可以发起异步请求来获取服务器端的数据。例如,从 API 获取用户信息并填充到组件的data属性中。

   new Vue({
     created() {
       axios.get('/api/userInfo').then(response => {
         this.user = response.data;
       });
     },
     data() {
       return {
         user: null
       };
     }
   });
2.初始化组件数据

对于一些本地数据的初始化,如设置默认值或者根据初始条件计算某些数据,也可以在created钩子中进行。例如,根据用户权限初始化菜单列表。

   new Vue({
     created() {
       if (this.user.role === 'admin') {
         this.menuList = ['dashboard', 'users', 'settings'];
       } else {
         this.menuList = ['dashboard'];
       }
     },
     data() {
       return {
         user: {role: 'user'},
         menuList: []
       };
     }
   });

二、DOM 操作相关

1.操作挂载后的 DOM 元素

在mounted钩子函数中,因为实例已经挂载到 DOM 上,可以安全地进行 DOM 操作。比如获取某个 DOM 元素的尺寸、添加自定义的 DOM 事件监听器等。

   new Vue({
     mounted() {
       const element = document.querySelector('.my - element');
       console.log(element.offsetWidth);
       element.addEventListener('click', this.handleClick);
     },
     methods: {
       handleClick() {
         console.log('Element clicked!');
       }
     }
   });
2.第三方插件或库的初始化

许多第三方插件需要在 DOM 元素存在后进行初始化。例如,初始化一个自定义的日期选择器插件,需要在mounted钩子中进行操作。

   new Vue({
     mounted() {
       const picker = new DatePicker('#date - picker - element');
     }
   });

三、响应数据变化与性能优化

1.数据更新时的额外操作

在beforeUpdate和updated钩子函数中,可以在数据更新时进行额外的操作。例如,在beforeUpdate中判断数据是否真正发生变化,如果没有实质变化则阻止不必要的 DOM 更新,从而提高性能。

   new Vue({
     data() {
       return {
         value: 0
       };
     },
     beforeUpdate() {
       if (this.oldValue === this.value) {
         // 阻止更新
         return;
       }
       this.oldValue = this.value;
     },
     updated() {
       // 执行依赖于更新后DOM的操作
     }
   });
2.处理复杂的计算属性更新

当计算属性依赖于多个数据并且更新逻辑复杂时,可以在beforeUpdate或updated钩子中进行相关的逻辑处理,确保计算属性的结果正确更新并且不会造成性能问题。

四、资源清理与内存管理

1.定时器与事件监听器的清除

在beforeDestroy钩子函数中,当组件被销毁时,可以清除定时器、解绑事件监听器等,以避免内存泄漏。例如,如果在组件创建时设置了一个定时器,在beforeDestroy中就需要将其清除。

   new Vue({
     data() {
       return {
         timer: null
       };
     },
     created() {
       this.timer = setInterval(() => {
         console.log('Timer running');
       }, 1000);
     },
     beforeDestroy() {
       clearInterval(this.timer);
     }
   });
2.取消异步操作

如果组件中有正在进行的异步操作(如未完成的网络请求),在beforeDestroy中可以尝试取消这些操作,以防止不必要的资源消耗或者数据不一致性。例如,使用axios的取消请求功能。

   new Vue({
     data() {
       return {
         cancelToken: null,
         data: null
       };
     },
     created() {
       const source = axios.CancelToken.source();
       this.cancelToken = source.token;
       axios.get('/api/data', {cancelToken: source.token}).then(response => {
         this.data = response.data;
       });
     },
     beforeDestroy() {
       if (this.cancelToken) {
         axios.cancel(this.cancelToken);
       }
     }
   });

四、总结

Vue 的生命周期和钩子函数为我们提供了强大的工具,使我们能够在不同阶段对组件进行精细的控制。通过合理地使用这些钩子函数,我们可以实现更加高效、灵活和可维护的 Vue 应用程序。在实际开发中,我们应该根据具体的需求选择合适的钩子函数来执行相应的操作,以提高开发效率和应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LSTM时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测

本文内容&#xff1a;Python实现LSTM长短期记忆神经网络时间序列预测&#xff0c;使用的数据集为AirPassengers 目录 数据集简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 数据集简介 AirPassengers 数据集的来源可以追溯到经典的统计和时间序列分析文献。原始数据集由 Box,…

Windows下MYSQL8.0如何恢复root权限

误操作把root权限清掉导致数据库无法登录&#xff08;确实很难受&#xff09;&#xff0c;在网上找了很多方法&#xff0c;发现没有很行之有效的方法&#xff0c;在多方尝试终于找到了适合敏感宝宝体质的方法。 C:\Users\Administrator>mysql -u root -P3307 ERROR 1045 (2…

下标记数(一)

第1题 0~5出现次数&#xff08;程序填空&#xff09; 统计出一串0~5数字构成的数列中&#xff0c;6种数字各自出现的次数。 输入格式 第一行1个正整数&#xff1a;N&#xff0c;范围在[1,100]。第二行N个由0~5组成的数列。 输出格式 一行6个整数&#xff0c;分别是0~5出现的…

免杀对抗—javaASMMSF源码特征修改汇编调用CS内联C

前言 今天讲最后的两个语言java和汇编&#xff0c;那么基本所有语言就讲了一个遍了。java在后门免杀这一块呢其实是有点鸡肋的&#xff0c;其它语言编译成的是exe&#xff0c;而java编译成的是jar包&#xff0c;而jar包又得有java环境才能运行&#xff0c;不像exe是个电脑都行…

股市大涨,为什么交易所系统奔溃

最近股市大涨&#xff0c;创造了开盘 35分钟成交量、单日成交量等等突破性历史记录。伴随而来的多家交易所系统奔溃的消息。今天&#xff0c;聊一下&#xff0c;当股市大涨时&#xff0c;交易所系统为何会崩溃。 首先&#xff0c;让我们以股市的角度切入。股市的每一次大涨&am…

YOLOV5改进系列(3)——ECA注意力机制

一、ECA注意力机制介绍、 论文地址&#xff1a;ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks | IEEE Conference Publication | IEEE Xplore 1. ECA的本质&#xff1a; ECA是一种通道注意力机制的实现形式&#xff0c;基于SE&#xff08;Squ…

代码签名证书:守护软件安全与信任的第一道防线

提起软件代码签名证书&#xff0c;可能对大多数人来说比较陌生&#xff0c;但是对于软件开发者来说是一款在软件发布前必不可少的工具。之所以这样说的原因在于&#xff0c;代码签名证书可以有效保障用户和软件开发者的权益。 代码签名证书是数字证书的一种&#xff0c;是专为…

什么是快充协议、支持多协议的USB Type-C受电端取电芯片

随着快充技术的不断发展&#xff0c;传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间&#xff0c;给我们的生活带来了很多便利。 什么是快充协议 快充协议是快充技术的核心&#xff0c;现如今市面上已经有很多种快充协议…

Find My扫描笔|苹果Find My技术与扫描笔结合,智能防丢,全球定位

扫描笔通过扫描技术&#xff0c;直接将图像&#xff0c;表格或者印刷字体等扫描到笔里存储或者直接传送到电脑&#xff0c;进行存储阅读或者编辑修改等操作。其很方便携带&#xff0c;便于移动办公&#xff1b;其主要是用于扫描办公文件&#xff0c;文字、身份证&#xff0c;名…

步步精科技诚邀您参加2024慕尼黑华南电子展

尊敬的客户&#xff1a; 我们诚挚地邀请您参加即将于2024年10月14日至10月16日在深圳国际会展中心 &#xff08;宝安新馆&#xff09;举办的慕尼黑华南电子展(electronica South China)。本届将聚焦人工智能、数据中心、新型储能、无线通信、硬件安全、新能源汽车、第三代半导…

7.存储过程中的事务管理(7/10)

1.引言 在现代信息技术快速发展的今天&#xff0c;数据库已经成为存储和管理数据的核心工具。无论是企业级应用、电子商务平台还是个人项目&#xff0c;数据库都扮演着不可或缺的角色。在这些应用中&#xff0c;数据的完整性、一致性和可靠性是至关重要的。这就引出了数据库事…

自动驾驶系列—从速度感知到车身控制:轮速计在自动驾驶中的应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

ViVado HLS 2018.3基本开发流程

1.双击打开软件 2.点击Create New Project 3.输入项目名称和位置 4.Next->Next->Next 5.根据所选的器件创建解决方案 6.添加文件 点击"Source"添加.c/cpp或者.h文件,在TestBench里面添加要测试的文件.c/cpp并且可以包含main函数. led.h #ifndef _SHIFT_LED_H…

IDEA搭建JDK1.8源码调试环境

大家好 下载源码 安装好 JDK 后&#xff0c;源码目录下面有 src.zip 文件&#xff0c;这个文件就是 JDK 的源码 搭建调试环境 新建 Maven 工程&#xff0c;包含以下文件 source&#xff1a;源码文件夹&#xff08;手动新建&#xff09;test&#xff1a;单元测试文件夹&…

[C++][第三方库][Websocket]详细讲解

目录 1.Websocket 协议1.介绍2.原理简介 2.Websocketpp1.介绍2.安装 3.常用接口4.使用 1.Websocket 协议 1.介绍 WebSocket是从HTML5开始支持的一种网页端和服务端保持长连接的消息推送机制产生原因&#xff1a; 传统的web程序都是属于"一问一答"的形式 即客户端给…

【王道视频笔记】红黑树的定义和性质

文章目录 关于黑高的结论红黑树的插入 平衡二叉树 AVL:插入/删除 很容易破坏“平衡”特性&#xff0c;需要频繁调整树的形态。如:插入操作导致不平衡&#xff0c;则需要先计算平衡因子&#xff0c;找到最小不平衡子树(时间开销大)&#xff0c;再进行 LL/RR/LR/RL 调整 红黑树 R…

极狐GitLab X 某轨道交通控制系统龙头企业,助力业务研发敏捷化

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 60天专业…

Linux常用应急溯源命令

常用命令 1、账号相关命令 1、查询特权用户特权用户(uid 为0)&#xff1a;awk -F: $30{print $1} etc/passwd 2、查询可以远程登录的帐号信息&#xff1a;awk /\$1|\$6/{print $1} etc/shadow 2、程序相关命令 1、查看当前开放端口netstat -tnlp 2、查看当前系统上运行的所…

华为中级认证HCIP知识点总结,建议收藏

01 OSPF知识点 OSPF基本配置&#xff0c;OSPF 5种报文&#xff0c;7种邻居状态&#xff0c;4种网络类型&#xff0c;4种特殊区域&#xff0c;7类LSA&#xff0c;4种link type&#xff0c;标识一条LSA的3个要素&#xff0c;OSPF邻居域邻接关系&#xff0c;单区域&#xff0c;多区…

生成对抗网络GAN——学习笔记

经过大量阅读资料和博客&#xff0c;对GAN的认识和学习做一个记录。个人粗浅的认识&#xff0c;不管是什么模型都离不开最基础的神经网络。主要借鉴的博客内容如下 新型的神经网络模型&#xff0c;从CNN到BERT都有介绍。_最新的神经网络模型-CSDN博客 生成对抗网络——GAN&am…