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('组件将卸载')
  })
}

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

相关推荐
C澒几秒前
微前端容器标准化 —— 公共能力篇:通用请求
前端·架构
llxxyy卢9 分钟前
web部分中等题目
android·前端
若惜19 分钟前
selenium自动化测试web自动化测试 框架封装Pom
前端·python·selenium
Amumu1213832 分钟前
Js:内置对象
开发语言·前端·javascript
广州华水科技34 分钟前
2026年单北斗GNSS变形监测系统推荐,助力精准监控与智慧城市建设
前端
鸡吃丸子38 分钟前
如何编写一个高质量的AI Skill
前端·ai
我命由我123451 小时前
Element Plus 2.2.27 的单选框 Radio 组件,选中一个选项后,全部选项都变为选中状态
开发语言·前端·javascript·html·ecmascript·html5·js
Luna-player1 小时前
第3章 Spring Boot的Web应用支持,个人学习笔记
前端·spring boot·学习
bugcome_com1 小时前
【ASP.NET Web Pages】页面布局核心实战:从复用性到安全性,打造一致化网站界面
前端·后端·asp.net
Sylus_sui1 小时前
Class 模型 + 跨组件状态(@Observed)+ 网络请求封装 + 本地存储全部是鸿蒙 Next/Stage 模型标准写法
前端