技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • Vue2 基础

    • Vue 学习指南
    • Vue2 快速入门
    • Vue2 模板语法
    • Vue2 组件基础
    • Vue2 计算属性与侦听器
    • Vue2 生命周期
  • Vue2 进阶

    • Vue2 组件通信
    • Vue2 插槽详解
    • Vue2 混入与自定义指令
    • Vue2 过渡与动画
    • Vuex 状态管理
  • Vue2 高级

    • Vue2 性能优化
    • Vue2 服务端渲染(SSR)
    • Vue2 源码解析
  • Vue3 基础

    • Vue3 快速入门
    • Vue3 Composition API
    • Vue3 响应式系统
    • Vue3 组件基础
    • Vue3 生命周期
  • Vue3 进阶

    • Vue3 组合式函数
    • Vue3 组件通信
    • Vue3 Teleport 与 Suspense
    • Pinia 状态管理
    • Vue Router 4
  • Vue3 高级

    • Vue3 TypeScript
    • Vue3 性能优化
    • Vue3 测试
    • Vue3 SSR
    • Vue3 源码解析
  • 实战项目

    • Vue2 实战项目
    • Vue3 实战项目
    • Vue2 迁移 Vue3

Vue2 生命周期

生命周期图示

创建阶段
  ↓
beforeCreate
  ↓
created
  ↓
beforeMount
  ↓
mounted
  ↓
更新阶段(数据变化时)
  ↓
beforeUpdate
  ↓
updated
  ↓
销毁阶段
  ↓
beforeDestroy
  ↓
destroyed

生命周期钩子详解

beforeCreate

在实例初始化之后,数据观测和事件配置之前被调用。

beforeCreate() {
  console.log('beforeCreate')
  console.log(this.message) // undefined
}

created

实例创建完成后被立即调用。此时已完成数据观测、属性和方法的运算、watch/event 事件回调。

created() {
  console.log('created')
  console.log(this.message) // 可以访问
  // 适合进行 API 调用
  this.fetchData()
}

beforeMount

在挂载开始之前被调用,相关的 render 函数首次被调用。

beforeMount() {
  console.log('beforeMount')
  console.log(this.$el) // undefined
}

mounted

实例被挂载后调用,此时 el 被新创建的 vm.$el 替换。

mounted() {
  console.log('mounted')
  console.log(this.$el) // 可以访问 DOM
  // 适合进行 DOM 操作
  this.$refs.input.focus()
}

beforeUpdate

数据更新时调用,发生在虚拟 DOM 打补丁之前。

beforeUpdate() {
  console.log('beforeUpdate')
  console.log('DOM 还未更新')
}

updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。

updated() {
  console.log('updated')
  console.log('DOM 已更新')
}

beforeDestroy

实例销毁之前调用。此时实例仍然完全可用。

beforeDestroy() {
  console.log('beforeDestroy')
  // 清理定时器、取消订阅等
  clearInterval(this.timer)
}

destroyed

实例销毁后调用。此时所有的事件监听器会被移除,所有的子实例也会被销毁。

destroyed() {
  console.log('destroyed')
}

实际应用场景

API 调用

created() {
  this.fetchUserData()
},
methods: {
  async fetchUserData() {
    const response = await fetch('/api/user')
    this.userData = await response.json()
  }
}

DOM 操作

mounted() {
  this.$refs.chart.init()
  this.initThirdPartyLibrary()
}

定时器管理

data() {
  return {
    timer: null
  }
},
mounted() {
  this.timer = setInterval(() => {
    this.updateTime()
  }, 1000)
},
beforeDestroy() {
  if (this.timer) {
    clearInterval(this.timer)
  }
}

事件监听

mounted() {
  window.addEventListener('resize', this.handleResize)
},
beforeDestroy() {
  window.removeEventListener('resize', this.handleResize)
}

父子组件生命周期顺序

加载渲染过程

父 beforeCreate
父 created
父 beforeMount
子 beforeCreate
子 created
子 beforeMount
子 mounted
父 mounted

更新过程

父 beforeUpdate
子 beforeUpdate
子 updated
父 updated

销毁过程

父 beforeDestroy
子 beforeDestroy
子 destroyed
父 destroyed

注意事项

  1. 不要在生命周期钩子中使用箭头函数
  2. mounted 不保证所有子组件也都被挂载完成
  3. updated 不保证所有子组件也都被重新渲染完毕
  4. 避免在 updated 中修改状态,可能导致无限循环
最近更新: 2026/1/27 15:51
Contributors: hailong
Prev
Vue2 计算属性与侦听器