当前位置: 首页 > article >正文

Vue 3 组合式 API 中的组件生命周期函数详解

Vue 3 组合式 API 中的组件生命周期函数详解

Vue 3 引入了组合式 API(Composition API),相比于选项式 API(Options API),它更加灵活且易于复用。在组件的开发中,生命周期函数是必不可少的一部分,用于在特定的阶段执行逻辑操作。本文将详细讲解 Vue 3 组合式 API 的生命周期函数及其相关知识点,并通过语法糖实现相关示例。


什么是生命周期函数?

Vue 组件从创建到销毁的过程中,会经历一系列的生命周期阶段。每个阶段会触发相应的生命周期函数,让开发者可以在这些函数中执行逻辑,比如初始化数据、订阅事件、清理资源等。

在 Vue 3 中,生命周期函数以组合式 API 的方式,通过 onXXX 函数实现,这些函数是 Vue 提供的全局 API。


Vue 3 组件生命周期函数一览

以下是 Vue 3 组合式 API 的生命周期函数,以及它们的触发时机和典型用途:

生命周期函数触发时机典型用途
onBeforeMount在组件挂载到 DOM 之前初始化非响应式数据,设置全局状态
onMounted组件挂载到 DOM 后DOM 操作,数据获取,启动计时器
onBeforeUpdate组件更新之前(响应式数据变化引起)比较数据变化,执行更新前的逻辑
onUpdated组件更新完成后DOM 操作,更新 UI
onBeforeUnmount组件卸载之前清理资源(如计时器、订阅等)
onUnmounted组件卸载完成后完全清理已不再使用的资源
onErrorCaptured捕获子组件的运行时错误捕获并处理错误,提供友好的错误提示

组合式 API 的生命周期函数使用

生命周期函数通过直接调用 onXXX 函数实现。在组合式 API 中,这些函数需要在 setup() 函数内部调用。

1. onBeforeMountonMounted 示例
<script setup>
import { ref, onBeforeMount, onMounted } from 'vue';

// 定义一个响应式数据
const message = ref('');

// 生命周期逻辑
onBeforeMount(() => {
  console.log('组件即将挂载');
  message.value = '组件挂载之前初始化的数据';
});

onMounted(() => {
  console.log('组件已挂载');
  // 模拟数据请求
  setTimeout(() => {
    message.value = '组件挂载后获取的数据';
  }, 1000);
});
</script>

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

2. onBeforeUpdateonUpdated 示例
<script setup>
import { ref, onBeforeUpdate, onUpdated } from 'vue';

const count = ref(0);

onBeforeUpdate(() => {
  console.log('组件更新前的 count:', count.value);
});

onUpdated(() => {
  console.log('组件更新后的 count:', count.value);
});

const increment = () => {
  count.value++;
};
</script>

<template>
  <div>
    <p>当前计数:{{ count }}</p>
    <button @click="increment">增加计数</button>
  </div>
</template>

3. onBeforeUnmountonUnmounted 示例
<script setup>
import { ref, onBeforeUnmount, onUnmounted } from 'vue';

const timer = ref(null);

// 创建一个计时器
onMounted(() => {
  timer.value = setInterval(() => {
    console.log('计时器运行中...');
  }, 1000);
});

// 清理计时器
onBeforeUnmount(() => {
  console.log('组件即将卸载,清理资源中...');
  clearInterval(timer.value);
});

onUnmounted(() => {
  console.log('组件已卸载');
});
</script>

<template>
  <div>
    <p>计时器正在运行...</p>
  </div>
</template>

4. 捕获错误:onErrorCaptured 示例
<script setup>
import { ref, onErrorCaptured } from 'vue';

const hasError = ref(false);

onErrorCaptured((err, instance, info) => {
  console.error('捕获到错误:', err);
  console.warn('错误信息:', info);
  hasError.value = true;
  return false; // 返回 false 阻止错误冒泡
});
</script>

<template>
  <div>
    <p v-if="hasError">发生错误,请稍后重试。</p>
    <p v-else>一切正常</p>
  </div>
</template>

生命周期函数的最佳实践

  1. 清理资源:在组件销毁时,清理如定时器、事件监听器、WebSocket 连接等资源,避免内存泄漏。
  2. 模块化逻辑:将复杂的逻辑封装成独立的函数或自定义 Hook,使代码更易维护。
  3. 错误捕获:使用 onErrorCaptured 捕获错误,提升用户体验。
  4. 依赖注入:如果组件间有复杂的依赖关系,可以通过 Vue 的 provide/inject API 在父子组件之间共享数据。

总结

Vue 3 的组合式 API 提供了更清晰和灵活的方式管理组件生命周期函数。通过 onXXX 函数,我们可以更方便地处理每个阶段的逻辑,同时实现代码复用与模块化。

完整代码示例如下,欢迎复制到本地试用并优化:

<script setup>
import { ref, onMounted, onUpdated, onUnmounted } from 'vue';

const message = ref('Hello Vue 3!');

// 生命周期逻辑
onMounted(() => {
  console.log('组件挂载');
  message.value = 'Vue 3 的组合式 API 很棒!';
});

onUpdated(() => {
  console.log('组件更新');
});

onUnmounted(() => {
  console.log('组件卸载');
});
</script>

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

http://www.kler.cn/a/399854.html

相关文章:

  • 在 Windows 11 中使用 MuMu 模拟器 12 国际版配置代理
  • QT仿QQ聊天项目,第三节,实现聊天界面
  • Linux下多线程
  • PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级
  • 基于Python空气质量可视化及预测
  • LeetCode题解:18.四数之和【Python题解超详细】,三数之和 vs. 四数之和
  • 正则表达式完全指南,总结全面通俗易懂
  • Elasticsearch:管理和排除 Elasticsearch 内存故障
  • MySQL 中有哪几种锁?
  • 【Mysql】函数--日期函数(上)
  • hive复杂数据类型Array Map Struct 炸裂函数explode
  • day-17 反转字符串中的单词
  • 【FacePoke人像表情调整】如何在本地和远程使用FacePoke进行AI人像表情调整
  • 后端-Result.java工具类和SystemCode.java工具类
  • 5. ARM_指令集
  • 如何手写实现 JSON Parser
  • 自己动手写Qt Creator插件
  • 电脑插入U盘, 电脑显示新增了,但是双击却显示 请将磁盘插入
  • 如何在 gdb 中执行命令
  • css 使用图片作为元素边框
  • shell脚本命令1,保姆级别---清风
  • 【jvm】G1垃圾收集器的特点,为什么低延迟
  • 组成字符串ku的最大次数(字节青训)
  • 农村生活污水排水监测系统:助力乡村生态环境建设
  • 北斗授时板卡 北斗双模PCI总线授时板卡优势分析 双模PCI授时板卡
  • ArchGuard 架构分析器发布:多语言、跨项目架构数据生成,助力 AI 时代知识挖掘...