vue3的生命周期

初始化阶段

setup()
javascript 复制代码
setup(props, context) {
  // 组合式API的入口
  // 在beforeCreate之前调用
  // 不能访问this
}

setup()是Composition API的入口点,在组件实例创建之前执行,此时无法访问组件实例(this)。

beforeCreate (选项式API)
javascript 复制代码
beforeCreate() {
  // 实例初始化后,数据观测和事件配置之前调用
  // 此时data、methods等还未初始化
}
created (选项式API)
javascript 复制代码
created() {
  // 实例创建完成后调用
  // 可以访问data、methods等
  // 但尚未挂载DOM,$el不可用
}

挂载阶段

onBeforeMount (Composition API) / beforeMount (选项式API)
javascript 复制代码
// Composition API
import { onBeforeMount } from 'vue'
 
setup() {
  onBeforeMount(() => {
    // 挂载开始之前被调用
  })
}
 
// 选项式API
beforeMount() {
  // 类似上面
}
onMounted (Composition API) / mounted (选项式API)
javascript 复制代码
// Composition API
import { onMounted } from 'vue'
 
setup() {
  onMounted(() => {
    // 组件挂载完成后调用
    // 可以访问DOM元素
  })
}
 
// 选项式API
mounted() {
  // 类似上面
}

更新阶段

javascript 复制代码
onBeforeUpdate (Composition API) / beforeUpdate (选项式API)
// Composition API
import { onBeforeUpdate } from 'vue'
 
setup() {
  onBeforeUpdate(() => {
    // 数据变化导致DOM更新之前调用
  })
}
// 选项式API
beforeUpdate() {
  // 类似上面
}
onUpdated (Composition API) / updated (选项式API)
javascript 复制代码
// Composition API
import { onUpdated } from 'vue'
 
setup() {
  onUpdated(() => {
    // DOM更新完成后调用
    // 注意:避免在此修改状态,可能导致无限循环
  })
}
 
// 选项式API
updated() {
  // 类似上面
}

卸载阶段

onBeforeUnmount (Composition API) / beforeUnmount (选项式API)
javascript 复制代码
// Composition API
import { onBeforeUnmount } from 'vue'
 
setup() {
  onBeforeUnmount(() => {
    // 组件卸载之前调用
    // 适合清理定时器、取消事件监听等
  })
}
 
// 选项式API
beforeUnmount() {
  // 类似上面
}
onUnmounted (Composition API) / unmounted (选项式API)
javascript 复制代码
// Composition API
import { onUnmounted } from 'vue'
 
setup() {
  onUnmounted(() => {
    // 组件卸载后调用
  })
}
 
// 选项式API
unmounted() {
  // 类似上面
}

让我们通过构建一个简单的数字时钟组件,感受各个生命周期的魔法时刻

javascript 复制代码
javascript
 体验AI代码助手
 代码解读
复制代码
// 完整代码文件:CounterTimer.vue
import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'

export default {
  setup() {
    const count = ref(0)
    let timerId = null

    // 1. beforeCreate 替代方案 - 使用 ref 初始化前
    onBeforeMount(() => {
      console.log('准备开始挂载组件')
    })

    // 2. created 替代方案 - setup 执行时
    console.log('组件刚创建完成,count 初始值:', count.value)

    // 3. mounted 核心逻辑
    onMounted(() => {
      timerId = setInterval(() => {
        count.value += 1
      }, 1000)
      console.log('组件已挂载,开启计时器')
    })

    // 4. beforeUpdate 前置操作
    onBeforeUpdate(() => {
      console.log('检测到数据变更,旧值:', count.value)
    })

    // 5. updated 后置操作
    onUpdated(() => {
      console.log('数据更新完成,新值:', count.value)
    })

    // 6. unmounted 清理工作
    onUnmounted(() => {
      clearInterval(timerId)
      console.log('组件即将销毁,清除计时器')
    })

    return {
      count
    }
  }
}

这个组件会经历完整的生命周期流程:

  1. 初始化时打印 count 初始值

  2. 挂载后启动计时器

  3. 每次数值更新前后打印日志

  4. 销毁时清理定时器

相关推荐
u0111026754 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
雪芽蓝域zzs9 小时前
第 7 节:多边形点击弹窗 + 清空绘制按钮
vue.js
溪语流沙10 小时前
【Web全栈进阶】Composition API与组件通信:props深入、emit、插槽
前端·css·vue.js
顽疲13 小时前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
志尊宝14 小时前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
桔筐14 小时前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
用户17335980753716 小时前
纯前端 PDF 按书签拆分避坑指南:拆分后章节对不上?
前端·javascript·vue.js
雪芽蓝域zzs17 小时前
Webstorm打开uniapp uvue文件报红处理方案
vue.js
撸串-研究生17 小时前
面向景区的综合服务管理平台设计——以稻城亚丁景区为例【附源码】
java·开发语言·vue.js·前后端分离·稻城亚丁景区
志尊宝1 天前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js