一、组合式 API 是什么?

组合式 API(Composition API)是 Vue3 引入的全新特性,它允许开发者通过函数式的方式组织组件逻辑。相比于 Vue2 的选项式 API(Options API),组合式 API 更加灵活,特别适合处理复杂组件的逻辑复用和代码组织。

简单来说,组合式 API 的核心思想是:把相关的逻辑代码放在一起,而不是像选项式 API 那样分散在 datamethodscomputed 等不同选项中。

示例:组合式 API 的基本结构

<script setup lang="ts">
import { ref, onMounted } from 'vue';

// 定义响应式数据
const count = ref(0);

// 定义方法
const increment = () => {
  count.value++;
};

// 生命周期钩子
onMounted(() => {
  console.log('组件挂载完成!');
});
</script>

<template>
  <button @click="increment">点击计数:{{ count }}</button>
</template>

注释说明:

  • ref 用于定义响应式数据。
  • onMounted 是 Vue3 的生命周期钩子,在组件挂载后执行。
  • <script setup> 是 Vue3 的语法糖,让组合式 API 更简洁。

二、Vue3 组合式 API 的生命周期钩子

在 Vue3 中,生命周期钩子以函数的形式提供,可以直接在 setup 中使用。以下是常用的生命周期钩子及其对应关系:

Vue2 选项式 API Vue3 组合式 API
beforeCreate 无直接对应(组合式 API 的 setup 替代)
created 无直接对应(组合式 API 的 setup 替代)
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeUnmount onBeforeUnmount
unmounted onUnmounted
activated onActivated(配合 <KeepAlive> 使用)
deactivated onDeactivated(配合 <KeepAlive> 使用)

示例:完整的生命周期钩子使用

<script setup lang="ts">
import {
  ref,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
} from 'vue';

const message = ref('Hello, Vue3!');

onBeforeMount(() => {
  console.log('组件即将挂载');
});

onMounted(() => {
  console.log('组件已挂载');
});

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

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

onBeforeUnmount(() => {
  console.log('组件即将卸载');
});

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

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

注释说明:

  • 每个钩子函数接收一个回调函数,在对应生命周期阶段执行。
  • onBeforeUpdateonUpdated 在数据变化时触发。
  • onBeforeUnmountonUnmounted 在组件销毁时触发。

三、组合式 API 生命周期的使用场景

1. 数据初始化(onMounted

在组件挂载后,通常需要从后端 API 获取数据。

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { fetchUserData } from './api';

const userData = ref(null);

onMounted(async () => {
  userData.value = await fetchUserData();
});
</script>

2. DOM 操作(onMounted

如果需要操作 DOM 元素(如使用第三方库),应该在 onMounted 中进行。

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import Chart from 'chart.js';

const chartRef = ref<HTMLCanvasElement | null>(null);

onMounted(() => {
  if (chartRef.value) {
    new Chart(chartRef.value, {
      type: 'line',
      data: { /* 图表数据 */ },
    });
  }
});
</script>

<template>
  <canvas ref="chartRef"></canvas>
</template>

3. 组件销毁时清理资源(onUnmounted

如果使用了定时器、事件监听等,需要在组件卸载时清理,避免内存泄漏。

<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue';

let timer: number;

onMounted(() => {
  timer = setInterval(() => {
    console.log('定时器运行中...');
  }, 1000);
});

onUnmounted(() => {
  clearInterval(timer);
});
</script>

4. 动态组件缓存(onActivated / onDeactivated

如果使用 <KeepAlive> 缓存组件,可以通过这两个钩子监听组件的激活/停用状态。

<script setup lang="ts">
import { onActivated, onDeactivated } from 'vue';

onActivated(() => {
  console.log('组件被激活');
});

onDeactivated(() => {
  console.log('组件被停用');
});
</script>

四、组合式 API 生命周期的优缺点

优点

  1. 逻辑复用更灵活:可以提取生命周期逻辑到单独的函数,便于复用。
  2. 代码组织更清晰:相关逻辑可以放在一起,而不是分散在不同选项中。
  3. 更好的 TypeScript 支持:组合式 API 天然适合 TypeScript,类型推断更友好。

缺点

  1. 学习成本较高:对于 Vue2 开发者,需要适应新的思维方式。
  2. 小型项目可能显得冗余:简单组件使用选项式 API 可能更直观。

注意事项

  1. 避免在 setup 中直接进行异步操作,应该使用 onMounted 或其他生命周期钩子。
  2. 谨慎使用 onBeforeUpdateonUpdated,它们会在每次数据变化时触发,可能导致性能问题。
  3. 清理副作用:如果使用了 setIntervaladdEventListener 等,一定要在 onUnmounted 中清理。

五、总结

Vue3 的组合式 API 让生命周期管理更加灵活,尤其适合复杂组件和大型项目。通过 onMountedonUnmounted 等钩子,我们可以更精细地控制组件的各个阶段。

适用场景:

  • 需要逻辑复用的组件。
  • 需要精细控制生命周期的场景(如 DOM 操作、资源清理)。
  • 使用 TypeScript 开发的项目。

不适用场景:

  • 简单的展示型组件(选项式 API 可能更直观)。

如果你刚开始接触 Vue3,建议先熟悉组合式 API 的基本概念,再逐步应用到实际项目中。