Vue3 生命周期钩子

组件从创建、挂载、更新到卸载,每个阶段都会触发对应的「钩子」函数。在合适的钩子里安排初始化、请求数据与清理资源,是写出稳定组件的基础。Vue3 同时提供选项式写法与带 on 前缀的组合式写法。

钩子对照表

Vue3 生命周期

选项式组合式触发时机
beforeCreatesetup 顶层实例初始化前
createdsetup 顶层实例创建完成
beforeMountonBeforeMount首次渲染之前
mountedonMounted挂载到 DOM 之后
beforeUpdateonBeforeUpdate数据变化、重新渲染前
updatedonUpdatedDOM 更新完成之后
beforeUnmountonBeforeUnmount组件卸载之前
unmountedonUnmounted组件卸载完成之后

组合式写法没有 beforeCreate 与 created,这些工作直接写在 setup 顶层即可。

挂载阶段:拉取数据

最常用的 mounted 钩子用来请求首屏数据:

import { ref, onMounted } from 'vue'

const users = ref([])

onMounted(async () => {
  const res = await fetch('/api/users')
  users.value = await res.json()   // 数据返回后模板自动渲染
})

此时 DOM 已就绪,无论请求数据还是操作元素都安全。

更新阶段:监听 DOM 变化

onUpdated 在数据变化导致 DOM 重绘后触发:

onUpdated(() => {
  console.log('界面已更新')   // 输出:界面已更新
})

注意不要在钩子内再次修改响应式数据,否则会陷入渲染死循环。

卸载阶段:清理资源

定时器、事件监听等必须在卸载时清理,防止内存泄漏:

import { onMounted, onUnmounted } from 'vue'

let timer

onMounted(() => {
  timer = setInterval(() => console.log('心跳'), 1000)
})

onUnmounted(() => {
  clearInterval(timer)   // 组件销毁时停止定时器
})

离开页面后控制台不再输出「心跳」,说明资源已正确释放。

缓存组件的激活钩子

组件被 KeepAlive 缓存时不会卸载,而是反复「激活、失活」:

import { onActivated, onDeactivated } from 'vue'

onActivated(() => console.log('组件被激活'))   // 输出:组件被激活
onDeactivated(() => console.log('组件被缓存'))  // 输出:组件被缓存

需要每次进入页面都刷新数据时,把请求写在 onActivated 而不是 onMounted 中。

小结

生命周期顺序为:创建 → 挂载 → 更新 → 卸载。请求数据放 onMounted,清理资源放 onUnmounted,缓存场景配合 onActivated 与 onDeactivated,按阶段做事即可让组件行为稳定可控。

笔记加载中…