【Vue】深入解析 Vue 生命周期:从创建到销毁的完整流程

news2024/11/15 12:54:22

文章目录

    • 一、Vue 生命周期概述
    • 二、创建阶段
      • 1. `beforeCreate` 钩子
      • 2. `created` 钩子
    • 三、挂载阶段
      • 1. `beforeMount` 钩子
      • 2. `mounted` 钩子
    • 四、更新阶段
      • 1. `beforeUpdate` 钩子
      • 2. `updated` 钩子
    • 五、销毁阶段
      • 1. `beforeDestroy` 钩子
      • 2. `destroyed` 钩子
    • 六、Vue 3 的生命周期钩子变化
    • 七、生命周期钩子的最佳实践

在 Vue.js 中,生命周期钩子是组件在创建、更新和销毁过程中触发的一系列事件。了解 Vue 的生命周期对开发者来说至关重要,它帮助我们在组件的不同阶段执行必要的逻辑。本文将详细介绍 Vue 生命周期的各个阶段、生命周期钩子的使用场景以及如何在实际开发中充分利用这些钩子函数。

一、Vue 生命周期概述

Vue 生命周期是指 Vue 实例从创建到销毁的整个过程。每个 Vue 组件都有一个生命周期,在不同的生命周期阶段,可以执行特定的操作。Vue 生命周期大致分为以下几个阶段:

  1. 创建阶段:Vue 实例的初始化过程。
  2. 挂载阶段:将 Vue 实例挂载到 DOM 上。
  3. 更新阶段:响应数据变化并更新视图。
  4. 销毁阶段:Vue 实例及其所有子组件的销毁过程。

二、创建阶段

1. beforeCreate 钩子

beforeCreate 钩子在 Vue 实例创建之后,但在数据观测和事件配置之前调用。此时,组件的 datamethods 尚未初始化。

beforeCreate() {
  console.log('实例初始化之前');
}

使用场景:适用于需要在组件初始化之前执行的操作,但通常不会在此阶段进行数据绑定或事件处理。

2. created 钩子

created 钩子在 Vue 实例创建完成后立即调用,此时组件的 data 已经被初始化,methodscomputed 也可以使用。DOM 元素尚未被挂载。

created() {
  console.log('实例创建完成,数据已初始化');
}

使用场景:适合进行数据获取、初始化时的异步操作、配置等操作。此时可以访问到组件的数据属性和方法,但无法直接操作 DOM。

三、挂载阶段

1. beforeMount 钩子

beforeMount 钩子在挂载开始之前调用,相关的 render 函数首次被调用之前。在此阶段,模板已被编译,但 DOM 元素尚未被插入到页面中。

beforeMount() {
  console.log('挂载开始之前');
}

使用场景:适用于在组件挂载之前进行一些准备工作,如调整即将插入 DOM 的数据结构等。

2. mounted 钩子

mounted 钩子在 Vue 实例挂载到 DOM 上之后调用。此时,组件的 DOM 元素已经可用,可以进行 DOM 操作。

mounted() {
  console.log('实例已挂载到 DOM 上');
}

使用场景:适合进行与 DOM 相关的操作,如插件初始化、第三方库的调用等。此时,组件的 DOM 元素已完全渲染并可操作。

四、更新阶段

1. beforeUpdate 钩子

beforeUpdate 钩子在数据更新之前调用,DOM 还没有被更新。这时可以访问到更新前的数据状态。

beforeUpdate() {
  console.log('数据更新之前');
}

使用场景:适用于在数据更新前执行某些操作,如获取旧的数据状态,或执行与数据更新相关的逻辑。

2. updated 钩子

updated 钩子在数据更新并重新渲染 DOM 后调用。此时,组件的 DOM 已经更新,可以执行与 DOM 更新相关的操作。

updated() {
  console.log('数据更新之后');
}

使用场景:适合在数据变化后执行 DOM 操作,或与数据更新相关的逻辑。需要注意避免在此钩子中进行可能引发无限循环的数据更新操作。

五、销毁阶段

1. beforeDestroy 钩子

beforeDestroy 钩子在 Vue 实例销毁之前调用。在此阶段,实例仍然可用,组件的 DOM 元素和子组件尚未被销毁。

beforeDestroy() {
  console.log('实例销毁之前');
}

使用场景:适合进行清理工作,如取消订阅、移除事件监听器、清除定时器等。确保在销毁之前完成所有必要的清理工作。

2. destroyed 钩子

destroyed 钩子在 Vue 实例销毁之后调用。在此阶段,组件的 DOM 元素和子组件已经被销毁,实例的所有数据和事件处理器也被清理。

destroyed() {
  console.log('实例已销毁');
}

使用场景:适用于进行组件销毁后的清理工作,或执行与销毁相关的逻辑。

六、Vue 3 的生命周期钩子变化

在 Vue 3 中,生命周期钩子的 API 做了一些调整。使用 Vue 3 的 Composition API,可以在 setup 函数中使用新的生命周期钩子函数:

  • onBeforeMount:替代 beforeMount
  • onMounted:替代 mounted
  • onBeforeUpdate:替代 beforeUpdate
  • onUpdated:替代 updated
  • onBeforeUnmount:替代 beforeDestroy
  • onUnmounted:替代 destroyed

示例代码:

import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue';

export default {
  setup() {
    onBeforeMount(() => {
      console.log('挂载开始之前');
    });

    onMounted(() => {
      console.log('实例已挂载到 DOM 上');
    });

    onBeforeUpdate(() => {
      console.log('数据更新之前');
    });

    onUpdated(() => {
      console.log('数据更新之后');
    });

    onBeforeUnmount(() => {
      console.log('实例销毁之前');
    });

    onUnmounted(() => {
      console.log('实例已销毁');
    });
  }
}

七、生命周期钩子的最佳实践

  1. 组件初始化和数据获取

created 钩子中进行数据初始化和异步操作,确保在组件渲染之前完成必要的数据准备。

  1. DOM 操作和插件初始化

mounted 钩子中执行与 DOM 相关的操作或插件初始化,以确保组件的 DOM 元素已经渲染完毕。

  1. 数据更新的优化

beforeUpdate 钩子中处理与数据更新相关的逻辑,避免在 updated 钩子中引发不必要的数据更新循环。

  1. 清理工作

beforeDestroyonBeforeUnmount 钩子中进行组件销毁前的清理工作,确保取消所有定时器、事件监听器等,以防内存泄漏。


在这里插入图片描述

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

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

相关文章

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中,我们学习了一些PHP extension for C的基本内容,下面结合一…

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份。中…

STM32智能城市交通管理系统教程

目录 引言环境准备智能城市交通管理系统基础代码实现:实现智能城市交通管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:城市交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能城…

HTTP协议、Wireshark抓包工具、json解析、天气爬虫

HTTP超文本传输协议 HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点: 一发一收…

vscode+wsl2+anaconda环境的配置与使用

目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu,可点击下面的链接。 问题:wsl install 无法解析服务器 成功记录: 在vscode终端用ubuntu安装anaconda。 创建pytho…

mybatis 主键的特殊要求

这是一条插入语句: 其目的就是为了将这个role对象插入到数据库, 然后他会根据getGeneratedKeys来自动回填id. 但是, 实际工作往往不是我们想象的那么简单,需要根据一些特殊的关系设置主键id 的值。 假设我们取消表trole 的id自增的规则,我们的要求是:如…

【element plus】el-tooltip限制宽度及自定义背景色

根据官方文档&#xff0c;使用popper-class参数为tooltip添加自定义内容&#xff1b;其中该类名注意不能够加scope标签中&#xff0c;否则无效。 <el-tooltip effect"dark" :popper-class"box-item" :hide-after"100" placement"right&q…

PyTorch 深度学习实践-处理多维特征的输入

视频指路 参考博客笔记 参考笔记二 通过多个线性模型来模拟非线性的空间变换&#xff0c;矩阵计算就是不同维度之间的空间转换 说明&#xff1a;1、乘的权重(w)都一样&#xff0c;加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的&#xff0c…

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用&#xff0c;ChatGPT 作为一种强大的自然语言处理技术&#xff0c;无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成&#xff0c;还是语音识别、计算机视觉等方面&#xff0c;ChatGPT 都有着广泛的应用前景。特别在临床医学领…

Web3D:WebGL为什么在渲染性能上输给了WebGPU。

WebGL已经成为了web3D的标配&#xff0c;市面上有N多基于webGL的3D引擎&#xff0c;WebGPU作为挑战者&#xff0c;在渲染性能上确实改过webGL一头&#xff0c;由于起步较晚&#xff0c;想通过这个优势加持&#xff0c;赶上并超越webGL仍需时日。 贝格前端工场为大家分享一下这…

大数据架构对比记录

Lambda架构 -维护两套项目&#xff0c;开发和维护成本高 -两套链路&#xff0c;数据容易不一致 -数据计算成本大&#xff08;例如原定每小时计算一次&#xff0c;但有额外新需求需要计算两点半-三点半之间数据&#xff0c;则需要重新计算&#xff09; Kappa -过于依赖kafka消…

Fiddler下载安装使用教程(包含移动端抓包)

一、官网下载安装 Download Fiddler Web Debugging Tool for Free by Telerik 1、下载Classic版本&#xff0c;并安装 2、安装完成后展示页面如下 3、点击Tools-options&#xff0c;如图所示勾选&#xff0c;允许抓取https请求 4、点击Actions-Export Root Certificate to D…

Spring如何管理Mapper

目录 一、背景二、猜测三、源码查看步骤1、创建MapperScannerConfigurer.java2、MapperScan注解3、MapperScannerRegistrar执行registerBeanDefinitions方法4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法5、执行doscan6、设置beanClass7、使用jdk生成代…

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…

解读「快意」大模型关键技术,揭秘实践中的挑战与创新

导读 2024年6月&#xff0c;GAITC 2024全球人工智能技术大会在杭州举办&#xff0c;在视觉大模型关键技术与应用主题论坛上&#xff0c;快手NLP专家林梓佳向参会者汇报了快手「快意」大模型研发过程中的多个关键技术创新&#xff0c;以及应用落地过程中的经验与挑战。 快手作…

为什么需要加密软件?2024五款电脑文件加密软件推荐

在高度数字化的2024年&#xff0c;数据安全对于个人和企业而言都显得至关重要。加密软件作为保护敏感信息的利器&#xff0c;扮演着不可或缺的角色。从个人隐私数据到企业财务记录、健康信息乃至企业核心机密&#xff0c;加密软件都能有效防止未经授权的访问。 加密软件的重要…

GitHub私有派生仓库(fork仓库) | 派生仓库改为私有

GitHub私有派生仓库 前言解决方案 前言 在GitHub上Fork的派生仓库默认为公有仓库&#xff0c;且无法修改为私有仓库。 若想创建私有的派生仓库&#xff0c;可通过GitHub的导入仓库功能实现&#xff0c;具体步骤请参见下文解决方案。 解决方案 打开GitHub页面&#xff0c;在个…

06.截断文本 选择任何链接 :root 和 html 有什么区别

截断文本 对超过一行的文本进行截断,在末尾添加省略号(…)。 使用 overflow: hidden 防止文本超出其尺寸。使用 white-space: nowrap 防止文本超过一行高度。使用 text-overflow: ellipsis 使得如果文本超出其尺寸,将以省略号结尾。为元素指定固定的 width,以确定何时显示省略号…

One-Class SVM

前提知识&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 主要思想 找一个超平面将样本中的正例圈出来&#xff0c;预测就是用这个超平面做决策&#xff0c;在圈内的样本就认为是正样本&#xff0c;圈外的是其他样本&#xff0c;如图1所示&#xff1a; 图1 OSVM…

怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择一、分区裁剪&#xff1a;精准切割&#xff0c;提…