【技术专题】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 里对应的是 beforeCreatemounted 等方法名。


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

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

还有两个和调试相关的钩子:onErrorCaptured(捕获后代错误)、onRenderTracked / onRenderTriggered(开发调试用)。入门阶段优先掌握 onMountedonBeforeUnmount / 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:定时器 + 正确清理

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

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>

运行截图:

相关推荐
宿67410 小时前
vue3-async
前端·javascript·vue.js
PBitW14 小时前
为什么vite中TS报错,可以继续运行?Webpack不行?
前端·webpack·typescript·vite
Dreams°12316 小时前
【Java后端+Vue前后端分离:内网正常、公网访问异常|5个高频经典踩坑完整复盘】
java·开发语言·vue.js
小蒜学长16 小时前
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
天道kabuto17 小时前
踩坑复盘:为什么在输入框按个回车,页面就偷偷刷新了?
vue.js
吴长建先生17 小时前
Vue.js支付回调页面如何设计才能保障对账准确性?
vue.js
leoZ23118 小时前
第 2 篇:搭建地基——Vue3 + Vite + Tailwind v4 + shadcn-vue
前端·javascript·vue.js·人工智能·目标检测·数据挖掘·语音识别
吴长建先生18 小时前
支付回调接口设计与代码规范:如何提升团队工程化能力
vue.js
zttbee19 小时前
vue2的API大白话讲解
前端·vue.js·前端框架
卤蛋fg621 小时前
vue 抽屉组件挂载到指定元素内显示,,表格自适应弹窗宽高
vue.js