Vue生命周期详细解析

news2025/4/25 22:17:48

前言

Vue.js作为当前最流行的前端框架之一,其生命周期钩子函数是每个Vue开发者必须掌握的核心概念。本文将全面解析Vue的生命周期,帮助开发者更好地理解Vue实例的创建、更新和销毁过程。

一、Vue生命周期概述

Vue实例从创建到销毁的整个过程被称为Vue的生命周期。在这个过程中,Vue提供了一系列的钩子函数(生命周期钩子),允许开发者在特定阶段添加自己的代码。

生命周期图示

在这里插入图片描述
图片来源官方

二、生命周期钩子函数详解

1. 创建阶段

beforeCreate
  • 调用时机:实例初始化之后,数据观测(data observer)和event/watcher事件配置之前
  • 特点
    • 此时无法访问到data、computed、methods等
    • 常用于插件开发中执行一些初始化任务
beforeCreate() {
  console.log('beforeCreate:', this.message); // undefined
  console.log('beforeCreate:', this.sayHello); // undefined
}
created
  • 调用时机:实例创建完成后立即调用
  • 特点
    • 可以访问data、computed、methods等
    • 尚未挂载DOM,$el属性不可用
    • 常用于异步数据请求
created() {
  console.log('created:', this.message); // 可以访问
  console.log('created:', this.sayHello()); // 可以调用
  console.log('created:', this.$el); // undefined
}

2. 挂载阶段

beforeMount
  • 调用时机:在挂载开始之前被调用
  • 特点
    • 模板编译完成,但尚未将模板渲染到页面
    • 很少使用,了解即可
beforeMount() {
  console.log('beforeMount:', this.$el); // 原始的挂载元素
}
mounted
  • 调用时机:实例被挂载后调用
  • 特点
    • 可以访问到渲染后的DOM
    • 常用于需要操作DOM的第三方库初始化
    • 注意:不保证所有子组件也都一起被挂载
mounted() {
  console.log('mounted:', this.$el); // 渲染后的DOM
  this.$nextTick(() => {
    // 仅在整个视图都被渲染之后才会运行的代码
  });
}

3. 更新阶段

beforeUpdate
  • 调用时机:数据变化时,虚拟DOM重新渲染和打补丁之前
  • 特点
    • 可以在更新前访问现有的DOM
    • 适合在更新之前访问现有的DOM,比如手动移除已添加的事件监听器
beforeUpdate() {
  console.log('beforeUpdate:', this.message);
}
updated
  • 调用时机:数据更改导致的虚拟DOM重新渲染和打补丁后
  • 特点
    • 可以执行依赖于DOM的操作
    • 注意:避免在此钩子中更改状态,可能会导致无限循环
    • 不保证所有的子组件也都一起被重绘
updated() {
  console.log('updated:', this.message);
  this.$nextTick(() => {
    // 仅在整个视图都被重新渲染之后才会运行的代码
  });
}

4. 销毁阶段

beforeDestroy
  • 调用时机:实例销毁之前
  • 特点
    • 实例仍然完全可用
    • 适合清除定时器、取消事件监听、取消订阅等清理工作
beforeDestroy() {
  console.log('beforeDestroy');
  clearInterval(this.timer);
}
destroyed
  • 调用时机:实例销毁后
  • 特点
    • 所有的事件监听器和子实例都被移除
    • 很少使用,了解即可
destroyed() {
  console.log('destroyed');
}

三、特殊生命周期钩子

activated

  • 使用场景<keep-alive>缓存的组件激活时调用
  • 特点:可用于重新获取数据或重置状态
activated() {
  console.log('组件被激活');
}

deactivated

  • 使用场景<keep-alive>缓存的组件停用时调用
  • 特点:可用于保存状态或清除定时器
deactivated() {
  console.log('组件被停用');
}

errorCaptured

  • 使用场景:捕获来自子孙组件的错误时调用
  • 特点
    • 可以返回false阻止错误继续向上传播
    • 可用于错误上报
errorCaptured(err, vm, info) {
  console.error('捕获到错误:', err);
  // 错误上报逻辑
  return false; // 阻止错误继续向上传播
}

四、生命周期使用场景总结

生命周期钩子常见使用场景
beforeCreate插件开发、初始化任务
created异步数据请求、初始化非DOM相关操作
beforeMount极少使用
mountedDOM操作、第三方库初始化
beforeUpdate更新前访问现有DOM
updated数据更新后的DOM操作
beforeDestroy清除定时器、取消事件监听、取消订阅
destroyed极少使用
activated缓存组件重新激活时的数据获取
deactivated缓存组件停用时的状态保存

五、注意事项

  1. 避免在生命周期钩子中使用箭头函数,这会改变this的指向
  2. 异步操作的影响:异步操作可能导致生命周期钩子的执行顺序不如预期
  3. 父子组件生命周期顺序
    • 父beforeCreate → 父created → 父beforeMount → 子beforeCreate → 子created → 子beforeMount → 子mounted → 父mounted
  4. 更新顺序:父beforeUpdate → 子beforeUpdate → 子updated → 父updated

六、总结

理解Vue生命周期对于开发高质量的Vue应用至关重要。通过合理利用生命周期钩子,我们可以在适当的时机执行代码,优化应用性能,处理各种边界情况。建议开发者在实际项目中多加练习,深入理解每个生命周期的特点和适用场景。

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

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

相关文章

基于c#,wpf,ef框架,sql server数据库,音乐播放器

详细视频: 【基于c#,wpf,ef框架,sql server数据库&#xff0c;音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5

前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程

前端项目搭建集锦&#xff1a;vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展&#xff0c;开箱即用&#xff0c;附带项目搭建教程 前言&#xff1a;一、Vue项目下载快速通道二、React项目下载快速通道三、BrowserPlugins项目下载快速通道四、项目搭建教…

什么是Maven

Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是&#xff1a;专家&#xff0c;内行。Maven 是目前最流行的自动化构建工具&#xff0…

neo4j中节点内的名称显示不全解决办法(如何让label在节点上自动换行)

因为节点过多而且想让节点中所有文字都显示出来而放大节点尺寸 从neo4j中导出png,再转成PDF来查看时&#xff0c;要看清节点里面的文字就得放大5倍才行 在网上看了很多让里面文字换行的办法都不行 然后找到一个比较靠谱的办法是在要显示的标签内加换行符 但是我的节点上显示的是…

【GIT】github中的仓库如何删除?

你可以按照以下步骤删除 GitHub 上的仓库&#xff08;repository&#xff09;&#xff1a; &#x1f6a8; 注意事项&#xff1a; ❗️删除仓库是不可恢复的操作&#xff0c;所有代码、issue、pull request、release 等内容都会被永久删除。 &#x1f9ed; 删除 GitHub 仓库步骤…

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…

【HCIA】简易的两个VLAN分别使用DHCP分配IP

前言 之前我们通过 静态ip地址实现了Vlan间通信 &#xff0c;现在我们添加一个常用的DHCP功能。 文章目录 前言1. 配置交换机2. 接口模式3. 全局模式后记修改记录 1. 配置交换机 首先&#xff0c;使用DHCP&#xff0c;需要先启动DHCP服务&#xff1a; [Huawei]dhcp enable I…

艾蒙顿桌面app下载-Emotn UI下载安装-emotn ui官方tv版安卓固件

在智能电视桌面应用的领域里&#xff0c;Emotn UI 凭借其简洁无广告、可自定义等特点&#xff0c;赢得了不少用户的关注。然而&#xff0c;小编深入了解后发现了一款更好用的电视桌面——乐看家桌面在诸多方面更具优势&#xff0c;能为你带来更优质的大屏体验。 乐看家桌面内置…

3、ArkTS语言介绍

目录 基础知识函数函数声明可选参数Rest参数返回类型箭头函数&#xff08;又名Lambda函数&#xff09;闭包 类字段字段初始化getter和setter继承父类访问方法重写方法重载签名可见性修饰符&#xff08;Public、Private、protected&#xff09; 基础知识 ArkTS是一种为构建高性…

修改了Element UI中组件的样式,打包后样式丢失

修改了Element UI中组件的样式&#xff0c;在本地运行没有问题&#xff0c;但是打包到线上发现样式丢失&#xff08;样式全部不生效、或者有一部分生效&#xff0c;一部分不生效&#xff09;&#xff0c;问题在于css的加载顺序导致代码编译后样式被覆盖了&#xff0c; 解决办法…

【springsecurity oauth2授权中心】jwt令牌更换成自省令牌 OpaqueToken P4

前言 前面实现了授权中心授权&#xff0c;客户端拿到access_token后就能请求资源服务器接口 权限的校验都是在资源服务器上进行的&#xff0c;授权服务器颁发的access_token有限期是2小时&#xff0c;也就是说在2小时之内&#xff0c;不管授权服务器那边用户的权限如何变更都…

诱骗协议芯片支持PD2.0/3.0/3.1/PPS协议,支持使用一个Type-C与电脑传输数据和快充取电功能

快充是由充电器端的充电协议和设备端的取电协议进行握手通讯进行协议识别来完成的&#xff0c;当充电器端的充电协议和设备端的取电协议握手成功后&#xff0c;设备会向充电器发送电压请求&#xff0c;充电器会根据设备的需求发送合适的电压给设备快速供电。 设备如何选择快充…

变量在template里不好使,在setup好使?

问题&#xff1a; 自定义的一个函数 &#xff0c;import导入后 setup里面使用正常 &#xff0c;在template里面说未定义 作用域问题 在 Vue 的模板语法中&#xff0c;模板&#xff08;template &#xff09;里能直接访问的是组件实例上暴露的属性和方法。从代码看&#xff0c…

OpenCV 图形API(53)颜色空间转换-----将 RGB 图像转换为灰度图像函数RGB2Gray()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为灰度。 R、G 和 B 通道值的常规范围是 0 到 255。生成的灰度值计算方式如下&#xff1a; dst ( I ) 0.299 ∗ src…

Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码

继续通过Trae向DeepSeek发问并修改程序&#xff0c;实现程序运行时生成数据库&#xff0c;用户在系统登录页面输入用户名和密码后&#xff0c;控制器通过模型查询用户数据库表来验证用户名和密码&#xff0c;验证通过后显示登录成功页面&#xff0c;验证失败则显示登录失败页面…

超详细mac上用nvm安装node环境,配置npm

一、安装NVM 打开终端&#xff0c;运行以下命令来安装NVM&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash 然后就会出现如下代码&#xff1a; > Profile not found. Tried ~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.…

hi3516cv610构建音频sample工程代码步骤

hi3516cv610构建音频sample工程代码步骤 sdk版本&#xff1a;Hi3516CV610_SDK_V1.0.1.0 硬件&#xff1a;非es8388 工程代码&#xff1a; 通过网盘分享的文件&#xff1a;audio_easy.zip 链接: https://pan.baidu.com/s/1gx61S_F3-pf6hPyfbGaRXg 提取码: 4gbg --来自百度网盘…

12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)

Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…

UML 顺序图:电子图书馆管理系统的交互之道

目录 一、初识 UML 顺序图 二、电子图书馆管理系统顺序图解析 &#xff08;一&#xff09;借阅流程 &#xff08;二&#xff09;归还流程 三、顺序图绘画 四、顺序图的优势与价值 五、总结 UML 顺序图是描绘系统组件交互的有力工具。顺序图直观展示消息传递顺序与对象协…

访问者模式:分离数据结构与操作的设计模式

访问者模式&#xff1a;分离数据结构与操作的设计模式 一、模式核心&#xff1a;将操作从数据结构中分离&#xff0c;支持动态添加新操作 在软件开发中&#xff0c;当数据结构&#xff08;如树、集合&#xff09;中的元素类型固定&#xff0c;但需要频繁添加新的操作&#xf…