Vue 中的生命周期钩子

Vue 中的生命周期钩子

Vue 组件的生命周期钩子分为以下几个阶段,以下是对 Vue 3 生命周期的详细说明(Vue 2 略有差异):

📌 创建阶段(初始化)

1. beforeCreate

  • 调用时机:实例初始化后,数据观测和事件/配置之前
  • 特点
    • 无法访问 datacomputedmethods
    • 常用于插件初始化
  • 示例
javascript 复制代码
beforeCreate() {
  console.log(this.message) // undefined
}

2. created

  • 调用时机:实例创建完成
  • 特点
    • 可以访问 datamethodscomputed
    • 无法访问 DOM(模板未挂载)
    • 常用于 API 请求、数据初始化
  • 示例
javascript 复制代码
created() {
  console.log(this.message) // 可访问
  this.fetchData()
}

📌 挂载阶段(DOM 渲染)

3. beforeMount

  • 调用时机:模板编译完成,但未挂载到 DOM
  • 特点
    • 模板已编译为渲染函数
    • 首次 render 函数即将被调用
  • 示例
javascript 复制代码
beforeMount() {
  console.log('DOM 即将渲染')
}

4. mounted

  • 调用时机:实例已挂载到 DOM
  • 特点
    • 可以访问 DOM 元素
    • 子组件不一定全部挂载完成
    • 常用于 DOM 操作、第三方库初始化
  • 示例
javascript 复制代码
mounted() {
  console.log(this.$el) // 访问 DOM
  this.initChart()     // 初始化图表库
}

📌 更新阶段(响应式数据变化)

5. beforeUpdate

  • 调用时机:数据改变后,DOM 重新渲染前
  • 特点
    • 可以获取更新前的 DOM 状态
    • 适合移除事件监听器等操作
  • 示例
javascript 复制代码
beforeUpdate() {
  console.log('数据更新前')
}

6. updated

  • 调用时机:DOM 已重新渲染完成
  • 特点
    • 可以执行依赖新 DOM 的操作
    • 避免在此修改状态(可能导致无限循环)
  • 示例
javascript 复制代码
updated() {
  console.log('DOM 更新完成')
  // 谨慎操作,可能触发再次更新
}

📌 卸载阶段(组件销毁)

7. beforeUnmount(Vue 3)/ beforeDestroy(Vue 2)

  • 调用时机:实例销毁前
  • 特点
    • 实例仍完全可用
    • 适合清理定时器、取消订阅、移除事件监听
  • 示例
javascript 复制代码
beforeUnmount() {
  clearInterval(this.timer)
  eventBus.off('event', this.handler)
}

8. unmounted(Vue 3)/ destroyed(Vue 2)

  • 调用时机:实例销毁后
  • 特点
    • 所有绑定已解除,子实例已销毁
    • 无法再访问实例
  • 示例
javascript 复制代码
unmounted() {
  console.log('组件已销毁')
}

📌 其他特殊钩子

9. errorCaptured

  • 调用时机:捕获后代组件错误时
  • 特点
    • 可以返回 false 阻止错误继续向上传播
  • 示例
javascript 复制代码
errorCaptured(err, instance, info) {
  this.error = err
  return false // 阻止传播
}

10. renderTracked(Vue 3 开发模式)

  • 调用时机:响应式依赖被跟踪时
  • 用途:调试响应式依赖

11. renderTriggered(Vue 3 开发模式)

  • 调用时机:响应式依赖触发重新渲染时
  • 用途:调试重新渲染原因

12. activated / deactivated

  • 调用时机<keep-alive> 缓存组件激活/停用时
  • 示例
javascript 复制代码
activated() {
  this.startPolling() // 恢复轮询
},
deactivated() {
  this.stopPolling()  // 停止轮询
}

📊 生命周期流程图

复制代码
创建阶段:
new Vue() → beforeCreate → 响应式初始化 → created

挂载阶段:
created → beforeMount → 编译模板 → 创建VDOM → 挂载DOM → mounted

更新阶段:
数据变化 → beforeUpdate → 重新渲染 → updated

卸载阶段:
beforeUnmount → 卸载组件 → unmounted

缓存组件:
deactivated → activated (当使用keep-alive时)

🎯 使用建议

  1. 数据请求createdmounted

    • SSR 用 created,客户端用 mounted
  2. DOM 操作mountedupdated

    • 注意 updated 可能多次触发
  3. 清理资源beforeUnmount

    • 定时器、事件监听、订阅等
  4. 避免副作用

    • 不要在 updated 中修改依赖数据
    • 避免在 beforeUpdate 中同步更改状态

🔄 Vue 2 vs Vue 3 差异

Vue 2 Vue 3 说明
beforeDestroy beforeUnmount 更名
destroyed unmounted 更名
- renderTracked 新增调试钩子
- renderTriggered 新增调试钩子

💡 组合式 API 中的生命周期

javascript 复制代码
import { onMounted, onUnmounted } from 'vue'

setup() {
  // 对应 created 和 beforeCreate 的代码直接写在 setup 中
  
  onMounted(() => {
    console.log('组件已挂载')
  })
  
  onUnmounted(() => {
    console.log('组件将卸载')
  })
}

理解这些生命周期钩子有助于在正确的时机执行相应的逻辑,避免常见错误并优化性能。

相关推荐
kyriewen16 小时前
你的网页慢,用户不说直接走——前端性能监控教你“读心术”
前端·性能优化·监控
广州华水科技16 小时前
北斗GNSS变形监测在大坝安全监测中的应用与优势分析
前端
前端老石人16 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实16 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha16 小时前
三目运算符
linux·服务器·前端
晓晨的博客17 小时前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect17 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
donecoding17 小时前
别再让 pnpm 跟着 nvm 跑了!独立安装终极指南
前端·node.js·前端工程化
不可能的是17 小时前
从 /simplify 指令深挖 Claude Code 多 Agent 协同机制
javascript
GISer_Jing17 小时前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习