[TOC]

Vue 3 的生命周期

Vue 3 的生命周期钩子与 Vue 2 类似,但部分名称有所调整,并引入了 Composition API 的新写法。以下是完整的生命周期钩子说明及使用方式:

1. Vue 3 生命周期钩子列表

Vue 2 钩子 Vue 3 钩子(Composition API) 触发时机
beforeCreate 无(由 setup() 替代) 组件实例初始化前,数据/方法未初始化。
created 无(由 setup() 替代) 组件实例创建完成,数据/方法已初始化,但未挂载 DOM。
beforeMount onBeforeMount 组件挂载到 DOM 前执行。
mounted onMounted 组件挂载到 DOM 后执行,可操作 DOM 或发起异步请求。
beforeUpdate onBeforeUpdate 数据变化导致 DOM 更新前执行。
updated onUpdated 数据变化导致 DOM 更新后执行,避免在此修改数据以免无限循环。
beforeUnmount onBeforeUnmount 组件卸载前执行,用于清理定时器、取消网络请求等。
unmounted onUnmounted 组件卸载后执行。
errorCaptured onErrorCaptured 捕获子组件或后代组件的错误。
activated onActivated <keep-alive> 缓存的组件激活时调用。
deactivated onDeactivated <keep-alive> 缓存的组件失活时调用。
新增调试钩子 onRenderTracked 跟踪渲染依赖(调试用)。
onRenderTriggered 跟踪触发重新渲染的原因(调试用)。

2. 使用方式

2.1 Composition API(推荐)

<script setup lang="ts">
  import { onMounted, onUnmounted } from 'vue';
  onMounted(() => {
    console.log('组件已挂载');
    // 发起数据请求或操作 DOM
  });
  onUnmounted(() => {
    console.log('组件已卸载');
    // 清理定时器或取消请求
  });
</script>

<!-- vue2形式 -->
<script lang="ts">
  import { onMounted, onUnmounted } from 'vue';
  export default {
    setup() {
      onMounted(() => {
        console.log('组件已挂载');
        // 发起数据请求或操作 DOM
      });
      return {};
    }
  };
</script>

2.2 选项式 API(传统写法)

与 Vue 2 类似,但钩子名称需调整:

export default {
  beforeMount() {
    console.log('beforeMount');
  },
  mounted() {
    console.log('mounted');
  },
  beforeUnmount() {
    console.log('beforeUnmount');
  },
  unmounted() {
    console.log('unmounted');
  }
};

3. 执行顺序

  1. 组件初始化 setup()onBeforeMountonMounted
  2. 数据更新 onBeforeUpdateonUpdated
  3. 组件卸载 onBeforeUnmountonUnmounted

生命周期流程图:

初始化 → setup()

beforeMount → 生成虚拟 DOM → 挂载真实 DOM → mounted

数据变化 → beforeUpdate → 重新渲染 → updated

卸载前 → beforeUnmount → 移除 DOM 和事件 → unmounted

4. 关键注意事项

  1. setup() 替代 beforeCreatecreated 所有初始化逻辑应放在 setup() 中,此时组件实例尚未完全创建,但可以访问 propscontext
  2. 避免在 updated 中修改数据 可能导致无限循环,应使用计算属性或侦听器替代。
  3. 异步操作与资源清理onUnmounted 中取消未完成的异步任务(如定时器、网络请求),防止内存泄漏。
  4. 调试钩子的使用场景 onRenderTrackedonRenderTriggered 用于追踪渲染性能问题,生产环境建议关闭。
  5. 如果是迁移 Vue 2 项目,重点关注钩子名称的调整和 setup() 的替代逻辑
Last Updated: 3/20/2025, 2:49:11 PM