以下是以资深软件开发工程师的视角,对“Vue3 生命周期钩子”的专业回答。我将详细讲解 Vue3 的生命周期钩子,包括每个钩子的定义、作用、使用场景和示例,结合 HTML5,包含目录、小标题、表格、代码示例和内部链接,确保内容清晰、技术准确且易于理解。回答基于截至 2025 年 3 月 17 日的最新信息,以 Vue 3.4.x(最新稳定版)为基准。


Vue3 生命周期钩子

目录

  1. 引言
  2. 什么是生命周期钩子?
  3. Vue3 生命周期钩子概览
  1. 选项式 API vs 组合式 API
  2. 完整示例
  3. 最佳实践与注意事项
  4. 结论

1. 引言

Vue3 的生命周期钩子是组件从创建到销毁过程中触发的特定函数,开发者可以在这些钩子中执行自定义逻辑,如初始化数据、操作 DOM 或清理资源。本教程将全面介绍 Vue3 的生命周期钩子,帮助您理解其作用并在项目中正确使用。


2. 什么是生命周期钩子?

  • 定义:生命周期钩子是 Vue 组件在不同阶段自动调用的函数,反映组件的创建、挂载、更新和销毁过程。
  • 作用
  • 在特定时机执行代码(如数据初始化、事件绑定)。
  • 管理组件状态和资源(如清理定时器)。
  • 特点:Vue3 沿用了 Vue2 的生命周期概念,但在组合式 API 中提供了对应的替代函数。

3. Vue3 生命周期钩子概览

3.1 创建阶段

钩子描述使用场景
beforeCreate组件创建前,datamethods 未初始化极少使用,通常用于调试
created组件创建后,datamethods 已初始化,但 DOM 未挂载初始化数据、调用 API

3.2 挂载阶段

钩子描述使用场景
beforeMount组件挂载到 DOM 前,模板已编译设置初始状态
mounted组件挂载到 DOM 后,可访问 DOMDOM 操作、事件绑定、异步请求

3.3 更新阶段

钩子描述使用场景
beforeUpdate数据更新后,DOM 重渲染前记录更新前的状态
updated数据更新后,DOM 重渲染完成DOM 操作、同步更新后逻辑

3.4 卸载阶段

钩子描述使用场景
beforeUnmount组件卸载前,仍然可用清理资源(如定时器)
unmounted组件卸载后,事件监听移除确认清理完成
  • 注意:Vue3 移除了 Vue2 的 beforeDestroydestroyed,改为 beforeUnmountunmounted,命名更贴近挂载/卸载的语义。

4. 选项式 API vs 组合式 API

Vue3 支持两种 API 使用生命周期钩子:

方式选项式 API组合式 API
定义方式直接在选项中定义setup() 中调用
钩子名称mountedonMounted
调用时机自动绑定到组件需显式导入和调用
示例mounted() {}onMounted(() => {})
  • 组合式 API 钩子
  • onBeforeMountonMountedonBeforeUpdateonUpdatedonBeforeUnmountonUnmounted
  • 需要从 vue 导入:import { onMounted } from 'vue';

5. 完整示例

以下是一个展示 Vue3 生命周期钩子的示例,使用选项式 API:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue3 生命周期钩子</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
  <div id="app">
    <p>计数: {{ count }}</p>
    <button @click="increment">增加</button>
  </div>

  <script>
    const app = Vue.createApp({
      data() {
        return {
          count: 0,
          timer: null
        };
      },
      beforeCreate() {
        console.log('beforeCreate: 数据未初始化', this.count); // undefined
      },
      created() {
        console.log('created: 数据已初始化', this.count); // 0
      },
      beforeMount() {
        console.log('beforeMount: DOM 未挂载', document.querySelector('#app').innerHTML);
      },
      mounted() {
        console.log('mounted: DOM 已挂载', document.querySelector('#app').innerHTML);
        this.timer = setInterval(() => this.count++, 1000); // 启动定时器
      },
      beforeUpdate() {
        console.log('beforeUpdate: 数据更新前', this.count);
      },
      updated() {
        console.log('updated: 数据更新后', this.count);
      },
      beforeUnmount() {
        console.log('beforeUnmount: 卸载前', this.count);
        clearInterval(this.timer); // 清理定时器
      },
      unmounted() {
        console.log('unmounted: 卸载完成');
      },
      methods: {
        increment() {
          this.count++;
        }
      }
    });

    const vm = app.mount('#app');
    // setTimeout(() => app.unmount(), 5000); // 5秒后卸载,触发卸载钩子
  </script>
</body>
</html>
  • 运行方法:保存为 lifecycle.html,在浏览器中打开(需联网加载 Vue)。
  • 效果
  • 控制台按顺序输出生命周期日志。
  • 计数每秒自动增加,点击按钮也可增加。
  • 若取消注释 setTimeout,5 秒后组件卸载并清理定时器。

6. 最佳实践与注意事项

  • 初始化逻辑:在 createdmounted 中发起 API 请求,避免阻塞渲染。
  • 资源清理:在 beforeUnmount 中移除事件监听或定时器,防止内存泄漏。
  • DOM 操作:仅在 mountedupdated 中操作 DOM,确保元素已渲染。
  • 调试:使用 console.log 或 Vue Devtools 跟踪生命周期执行。
  • 组合式 API:大型项目中推荐 onMounted 等,便于逻辑复用。

7. 结论

Vue3 的生命周期钩子提供了组件状态管理的强大工具,无论是选项式 API 还是组合式 API,都能满足不同开发需求。本教程通过示例展示了每个钩子的作用和用法。如需深入学习,可参考 Vue3 全局 API 或官方文档(vuejs.org)。


回答特点

  • 结构:包含目录、带锚点的小标题、表格和代码示例,逻辑清晰。
  • 实用性:从理论到实践,覆盖生命周期全貌。
  • 内部链接:通过 <a href="#ID"> 跳转,如 Vue3 生命周期钩子概览
  • 出站链接:嵌入正文,指向权威资源。