Vue3 生命周期钩子详解

ops/2024/11/25 10:48:14/

Vue3 生命周期钩子详解

简介

Vue3的生命周期钩子让我们能够在组件的不同阶段执行自定义代码。与Vue2相比,Vue3的生命周期钩子在Composition API中有了新的使用方式,但整体概念保持一致。

基础知识

Vue3中的生命周期钩子可以通过两种方式使用:

  1. 在setup()中使用onXXX形式的生命周期钩子
  2. 在Options API中使用与Vue2相似的方式

Composition API中的生命周期钩子

1. setup()

import { onMounted, onUpdated, onUnmounted } from 'vue'export default {setup() {// setup 本身就是在组件创建之前执行的console.log('组件初始化')onMounted(() => {console.log('组件已挂载')})return {}}
}

2. beforeCreate 和 created

在 Composition API 中,这两个钩子被 setup() 函数本身替代。setup() 函数在组件创建之前就被调用。

3. onMounted

import { onMounted } from 'vue'export default {setup() {onMounted(() => {// DOM已经可用console.log('组件已挂载到DOM')// 可以进行DOM操作const element = document.getElementById('my-element')// 可以调用第三方库初始化initializeThirdPartyLibrary()})}
}

4. onUpdated

import { onUpdated, ref } from 'vue'export default {setup() {const count = ref(0)onUpdated(() => {// 当响应式数据更新导致组件更新后调用console.log('组件已更新')console.log('当前计数:', count.value)})return {count}}
}

5. onUnmounted

import { onUnmounted } from 'vue'export default {setup() {// 设置定时器const timer = setInterval(() => {console.log('定时器执行中')}, 1000)onUnmounted(() => {// 清理工作clearInterval(timer)console.log('组件已卸载,资源已清理')})}
}

6. onBeforeMount

import { onBeforeMount } from 'vue'export default {setup() {onBeforeMount(() => {// 组件挂载到DOM之前调用console.log('组件即将挂载')})}
}

7. onBeforeUpdate

import { onBeforeUpdate, ref } from 'vue'export default {setup() {const message = ref('Hello')onBeforeUpdate(() => {// 组件更新之前调用console.log('组件即将更新')console.log('更新前的消息:', message.value)})return {message}}
}

8. onBeforeUnmount

import { onBeforeUnmount } from 'vue'export default {setup() {onBeforeUnmount(() => {// 组件卸载之前调用console.log('组件即将卸载')})}
}

9. onErrorCaptured

import { onErrorCaptured } from 'vue'export default {setup() {onErrorCaptured((err, instance, info) => {// 捕获来自子组件的错误console.error('捕获到错误:', err)console.log('错误来源组件:', instance)console.log('错误信息:', info)// 返回false阻止错误继续向上传播return false})}
}

完整的生命周期示例

import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,onErrorCaptured,ref
} from 'vue'export default {setup() {const count = ref(0)console.log('setup: 组件初始化')onBeforeMount(() => {console.log('onBeforeMount: 组件即将挂载')})onMounted(() => {console.log('onMounted: 组件已挂载')})onBeforeUpdate(() => {console.log('onBeforeUpdate: 组件即将更新')})onUpdated(() => {console.log('onUpdated: 组件已更新')})onBeforeUnmount(() => {console.log('onBeforeUnmount: 组件即将卸载')})onUnmounted(() => {console.log('onUnmounted: 组件已卸载')})onErrorCaptured((err, instance, info) => {console.log('onErrorCaptured: 捕获到错误')return false})return {count}}
}

生命周期钩子最佳实践

  1. 数据初始化
export default {setup() {const data = ref(null)onMounted(async () => {// 在mounted时获取初始数据try {data.value = await fetchData()} catch (error) {console.error('数据获取失败:', error)}})return {data}}
}
  1. 资源清理
export default {setup() {const eventHandler = () => {console.log('处理窗口调整事件')}onMounted(() => {// 添加事件监听window.addEventListener('resize', eventHandler)})onUnmounted(() => {// 移除事件监听window.removeEventListener('resize', eventHandler)})}
}

注意事项

  1. setup() 中没有 this
  2. 生命周期钩子只能在 setup() 中同步调用
  3. 确保在条件语句外调用生命周期钩子
  4. 多个同类型的生命周期钩子会按照定义顺序依次执行

调试技巧

export default {setup() {// 使用开发工具进行调试onMounted(() => {console.log('组件ID:', componentId)debugger // 可以设置断点})}
}

http://www.ppmy.cn/ops/136541.html

相关文章

C程序设计语言 第二章 类型、运算符与表达式

变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量与常量组合起来生成新的值。对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。本章将详细讲述这些内容。 AN…

C指针之舞——指针探秘之旅(2)

❤博客主页:折枝寄北-CSDN博客 ❤专栏:C语言学习专栏 在上一篇博客文章:C指针之舞——指针探秘之旅-CSDN博客中,我们学习了字符指针,指针数组,数组指针,数组传参和指针传参等内容,…

idea添加版权信息

1、添加Copyright Profiles 打开Settings -> Editor -> Copyright -> Copyright Profiles -> 新增 Copyright (c) 【你的版权信息】 【开始年份】-${today.year}. All rights reserved.如: Copyright (c) by cwp 2024-${today.year}. All rights rese…

链表的介绍与单链表的实现

1.链表的介绍 链表分为单链表与双链表。链表和顺序表一样,均属于顺序表,因此链表的逻辑结构是线性的。链表在内存中的存储方式是不一定连续的(因此链表的物理结构不一定是线性的),也不一定是按照顺序存储。 2、节点…

ESP32移植Openharmony外设篇(6)光敏电阻ADC读取

光照传感器 模块简介 产品描述 光敏电阻(photoresistor orlight-dependent resistor,后者缩写为LDR)是一种基于内光电效应的半导体元件,它的阻值依赖于入射光强的变化 。入射光强增加,光敏电阻的阻值减小&#xff0…

FIFO和LRU算法实现操作系统中主存管理

FIFO&#xff0c;用数组实现 1和2都是使用nextReplace实现新页面位置的更新 1、不精确时间&#xff1a;用ctime输出运行时间都是0.00秒 #include <iostream> #include <iomanip> #include<ctime>//用于计算时间 using namespace std;// 页访问顺序 int pa…

linux下i2c开发与框架源码分析

目录 1 概述 2 I2c子系统框架 3 I2C的使用流程 3.1 在驱动里使用 3.2 在应用层使用 3.3 I2ctool的使用 4 为硬件i2c注册一个适配器 5 i2c子系统源码流程分析 5.1 i2c device与driver绑定过程 5.1.1 Driver的注册与处理 5.1.2 Client device的生成 5.2 I2c的发送与接…

【C++】类(三):类的其它特性

7.3 类的其它特性 本节将继续介绍之前章节当中 Sales_data 没有体现出来的类的特性&#xff0c;包括&#xff1a;类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回*this、如何定义并使用类类型及友元类等。 7.3.1 类成员再探 这部分定义了一对相…