【技术专题】Vue3 - 生命周期

大家好,我是锋哥。最近连载更新Vue3+Vite+ElementPlus前端开发技术专题。

本课程主要介绍和讲解 Vue3框架,Vite构建工具,以及element-plus UI框架。Vue3核心知识介绍,Vite构建工具使用,以及element-plus UI框架的基础组件,配置组件,Form表单组件,Data数据展示组件,Navigation导航组件,Feedback反馈组件,Container布局组件介绍和使用。同时也配套视频教程《一天学会 Vue3 + Vite + element-plus UI框架 视频教程》

组件从创建、挂载到页面、更新,再到卸载,会经历一系列固定阶段。Vue 在这些节点提供了生命周期钩子,方便你在合适的时机执行逻辑(请求数据、操作 DOM、清理定时器等)。

组合式 API(<script setup>)里用的是 onXxx 函数;选项式 API 里对应的是 beforeCreate、mounted 等方法名。


1. 生命周期一览(组合式 API)

钩子 触发时机 常见用途
onBeforeMount 挂载前,DOM 尚未生成 很少单独用
onMounted 挂载完成,DOM 已就绪 请求接口、操作 DOM、启动定时器
onBeforeUpdate 数据变化导致更新前 更新前读取旧 DOM
onUpdated 更新完成,DOM 已刷新 依赖最新 DOM 的逻辑
onBeforeUnmount 卸载前 清理定时器、取消监听、中断请求
onUnmounted 卸载完成 收尾清理

还有两个和调试相关的钩子:onErrorCaptured(捕获后代错误)、onRenderTracked / onRenderTriggered(开发调试用)。入门阶段优先掌握 onMounted 和 onBeforeUnmount / onUnmounted。


2. 执行顺序

记忆口诀:挂载看 mounted,更新看 updated,离开记得清理 unmount。


3. 入门 Demo:计数 + 挂载提示

下面这个 Demo 展示最常用的两个钩子:

  • onMounted:组件挂载后打印提示、记录时间
  • onUnmounted:组件卸载时清理(这里用日志模拟)
xml 复制代码
<script setup>
/**
 * 生命周期入门 Demo
 * 演示 onMounted / onUnmounted 的基本用法
 */
import { ref, onMounted, onUnmounted } from 'vue'
​
const count = ref(0)
const tip = ref('组件尚未挂载')
​
/** 计数加一 */
function add() {
  count.value++
}
​
// 挂载完成:DOM 已就绪,适合初始化
onMounted(() => {
  tip.value = '组件已挂载(onMounted)'
  console.log('onMounted:可以安全操作 DOM 或请求数据')
})
​
// 卸载完成:做清理工作
onUnmounted(() => {
  console.log('onUnmounted:组件已卸载,记得清理副作用')
})
</script>
​
<template>
  <div>
    <h2>Vue3 生命周期 Demo</h2>
    <p>{{ tip }}</p>
    <p>当前计数:{{ count }}</p>
    <button @click="add">+1</button>
  </div>
</template>

要点:

  • 钩子要在 setup 同步阶段注册(<script setup> 顶层直接写即可)
  • onMounted 之后才能可靠拿到 DOM;发请求、document.querySelector 等多放这里
  • 组件销毁时一定要清理定时器、事件监听,避免内存泄漏

运行截图:


4. 进阶 Demo:定时器 + 正确清理

很多副作用(定时器、窗口监听)必须在卸载时关掉。用 onBeforeUnmount 或 onUnmounted 清理:

xml 复制代码
<script setup>
/**
 * 生命周期清理 Demo
 * 挂载时开启定时器,卸载时清除,避免内存泄漏
 */
import { ref, onMounted, onBeforeUnmount } from 'vue'
​
const now = ref('')
let timer = null
​
/** 把当前时间格式化为 2026-11-02 17:25:17 这种样式 */
function formatDateTime(date) {
  const pad = (n) => String(n).padStart(2, '0')
  return (
    `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ` +
    `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`
  )
}
​
onMounted(() => {
  now.value = formatDateTime(new Date())
  // 每秒刷新一次时间
  timer = setInterval(() => {
    now.value = formatDateTime(new Date())
  }, 1000)
})
​
// 卸载前清除定时器
onBeforeUnmount(() => {
  if (timer) {
    clearInterval(timer)
    timer = null
  }
})
</script>
​
<template>
  <div>
    <h2>当前时间</h2>
    <p>{{ now }}</p>
    <p>离开页面时会自动清除定时器</p>
  </div>
</template>

运行截图:

相关推荐
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
雪芽蓝域zzs3 天前
第26章:ECharts 自定义主题 + 页面一键切换主题(深色 / 浅色两套)
vue.js·echars
雪芽蓝域zzs3 天前
第22章:ECharts 图表联动(多图表交互联动)
vue.js·echars
daols883 天前
vue 表格组件 vxe-table 实现虚拟滚动与无需滚动加载
vue.js·vxe-table
雪芽蓝域zzs3 天前
第18章:ECharts 折线图 + 标记点、标记线,自定义 tooltip
vue.js·echars
雪芽蓝域zzs3 天前
第24章:ECharts 地图组件(基础行政区地图,若依 Vue3)
vue.js·echars
计算机毕设定制辅导-无忧学长3 天前
《基于Vue的流浪动物救助中心管理系统的设计与实现》
java·vue.js·spring boot·流浪动物救助中心管理系统
雪芽蓝域zzs3 天前
第25章:地图下钻交互(点击省份,切换到对应省份城市地图)
vue.js·echars