Vue3 生命周期钩子详解

news2024/11/24 13:17:09

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.coloradmin.cn/o/2246675.html

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

相关文章

用 React18 构建点击计分小游戏

本教程将带你创建一个简单的点击计分游戏,使用 React 和基本的 Hooks。游戏规则很简单:在 10 秒内尽可能多地点击按钮以获取高分。 项目结构 确保你的项目结构如下: 编写 ClickGame 组件 在 src/ClickGame.js 文件中,编写如下…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域,我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备,声称能够彻底改变我们对健康和健身的方式。 然而,在这些光鲜的外观和营销宣传背后,隐藏着一个令人担忧的现实:大多数这些…

数据结构:链表进阶

链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素&#xff1…

第二十二周机器学习笔记:动手深度学习之——线性代数

第二十周周报 摘要Abstract一、动手深度学习1. 线性代数1.1 标量1.2 向量1.3 矩阵1.4 张量1.4.1 张量算法的基本性质 1.5 降维1.5.1 非降维求和 1.6 点积1.6.1 矩阵-向量积1.6.2 矩阵-矩阵乘法 1.7 范数 总结 摘要 本文深入探讨了深度学习中的数学基础,特别是线性代…

Flink-Source的使用

Data Sources 是什么呢?就字面意思其实就可以知道:数据来源。 Flink 做为一款流式计算框架,它可用来做批处理,也可以用来做流处理,这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

分公司如何纳税

分公司不进行纳税由总公司汇总纳税“子公司具有法人资格,依法独立承担民事责任;分公司不具有法人资格,其民事责任由公司承担。”企业设立分支机构,使其不具有法人资格,且不实行独立核算,则可由总公司汇总缴纳企业所得税…

亚马逊搜索关键词怎么写?

在亚马逊这个全球领先的电子商务平台,如何让自己的产品被更多的消费者发现,是每一个卖家都需要深入思考的问题。而搜索关键词,作为连接卖家与买家的桥梁,其重要性不言而喻。那么,如何撰写有效的亚马逊搜索关键词呢&…

跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 Cross-view discrepancy-dependency network for volumetric medical imagesegmentation 跨视角差异-依赖网络用于体积医学图像分割 01 文献速递介绍 医学图像分割旨在从原始图像中分离出受试者的解剖结构(例如器官和肿瘤),并…

基本功能实现

目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…

C++11新特性探索:Lambda表达式与函数包装器的实用指南

文章目录 前言🍉一、Lambda表达式(匿名函数)🍓1.1 Lambda 表达式的基本语法🍓1.2 示例:基本 Lambda 表达式🍓1.3 捕获列表(Capture)🍓1.4 使用 Lambda 表达式…

msvcp110.dll丢失修复的多种科学方法分析,详细解析msvcp110.dll文件

遇到“msvcp110.dll丢失”的错误时,这表明你的系统缺少一个关键文件,但解决这一问题比较直接。本文将指导你通过几个简单的步骤迅速修复此错误,确保你的程序或游戏可以顺利运行。接下来的操作将非常简洁明了,易于理解和执行。 一.…

HDR视频技术之四:HDR 主要标准

HDR 是 UHD 技术中最重要维度之一,带来新的视觉呈现体验。 HDR 技术涉及到采集、加工、传输、呈现等视频流程上的多个环节,需要定义出互联互通的产业标准,以支持规模化应用和部署。本文整理当前 HDR 应用中的一些代表性的国际标准。 1 HDR 发…

Bug Fix 20241122:缺少lib文件错误

今天有朋友提醒才突然发现 gitee 上传的代码存在两个很严重,同时也很低级的错误。 因为gitee的默认设置不允许二进制文件的提交, 所以PH47框架下的库文件(各逻辑层的库文件),以及Stm32Cube驱动的库文件都没上传到Gi…

c++源码阅读__smart_ptr__正文阅读

文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…

【BUG】ES使用过程中问题解决汇总

安装elasticsearch内存不足问题 问题回顾 运行kibana服务的时候,无法本地访问 解决 首先排查端口问题,然后检查错误日志 无法运行kibana服务,是因为elasticsearch没有启动的原因 发现致命错误,确定是elasticsearch服务没有运行导…

C语言--分支循环编程题目

第一道题目&#xff1a; #include <stdio.h>int main() {//分析&#xff1a;//1.连续读取int a 0;int b 0;int c 0;while (scanf("%d %d %d\n", &a, &b, &c) ! EOF){//2.对三角形的判断//a b c 等边三角形 其中两个相等 等腰三角形 其余情…

Linux——用户级缓存区及模拟实现fopen、fweite、fclose

linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区&#xff08;类比输…

git(Linux)

1.git 三板斧 基本准备工作&#xff1a; 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候&#xff0c;只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加&#xff1f; 1.1 git add test.c 也不算完全添加到仓库里面&…

GESP2023年9月认证C++四级( 第三部分编程题(1-2))

编程题1&#xff08;string&#xff09;参考程序&#xff1a; #include <iostream> using namespace std; long long hex10(string num,int b) {//int i;long long res0;for(i0;i<num.size();i) if(num[i]>0&&num[i]<9)resres*bnum[i]-0;else //如果nu…

Ultiverse 和web3新玩法?AI和GameFi的结合是怎样

Gamef 和 AI 是我们这个周期十分看好两大赛道之一&#xff0c;(Gamef 拥有极强的破圈效应&#xff0c;引领 Web2 用户进军 Web3 最佳利器。AI是这个周期最热门赛道&#xff0c;无论 Web2的 OpenAl&#xff0c;还是 Web3&#xff0c;都成为话题热议焦点。那么结合 GamefiA1双叙事…