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. 销毁时清理定时器

相关推荐
我是小路路呀7 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
JIngJaneIL8 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
澄江静如练_8 小时前
列表渲染(v-for)
前端·javascript·vue.js
Loo国昌9 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
前端白袍9 小时前
Vue:如何实现一个具有复制功能的文字按钮?
前端·javascript·vue.js
new code Boy10 小时前
escape谨慎使用
前端·javascript·vue.js
爱分享的鱼鱼14 小时前
对比理解 Vue 响应式 API:data(), ref、reactive、computed 与 watch 详解
前端·vue.js
JS_GGbond14 小时前
【性能优化】给Vue应用“瘦身”:让你的网页快如闪电的烹饪秘籍
前端·vue.js
刘一说15 小时前
Vue Router:官方路由解决方案解析
前端·javascript·vue.js
计算机学姐15 小时前
基于php的摄影网站系统
开发语言·vue.js·后端·mysql·php·phpstorm