前端八股Vue---生命周期函数

目录

[一、Vue 2 vs Vue 3 生命周期对比](#一、Vue 2 vs Vue 3 生命周期对比)

二、图解Vue3生命周期

[三、为什么组合式 API 没有 beforeCreate 和 created?](#三、为什么组合式 API 没有 beforeCreate 和 created?)

[四、created 详解](#四、created 详解)

[3.1 执行时机](#3.1 执行时机)

[3.2 能做什么?](#3.2 能做什么?)

[3.3 不能做什么?](#3.3 不能做什么?)

[五、mounted 详解](#五、mounted 详解)

[4.1 执行时机](#4.1 执行时机)

[4.2 能做什么?](#4.2 能做什么?)

[Q1:Vue 3 有哪些生命周期函数?](#Q1:Vue 3 有哪些生命周期函数?)

[Q2:Vue 2 和 Vue 3 生命周期有什么区别?](#Q2:Vue 2 和 Vue 3 生命周期有什么区别?)

[Q3:onMounted 和 onUpdated 有什么区别?](#Q3:onMounted 和 onUpdated 有什么区别?)

[Q4:created 和 mounted 的区别?](#Q4:created 和 mounted 的区别?)

[Q5:什么时候用 created?什么时候用 mounted?](#Q5:什么时候用 created?什么时候用 mounted?)

[Q6:created 和 mounted 都能发请求,有什么区别?](#Q6:created 和 mounted 都能发请求,有什么区别?)


一、Vue 2 vs Vue 3 生命周期对比

Vue 2 Vue 3 变化
beforeCreate ❌ 移除 组合式 API 中不需要
created ❌ 移除 组合式 API 中不需要
beforeMount onBeforeMount 名称变化
mounted onMounted 名称变化
beforeUpdate onBeforeUpdate 名称变化
updated onUpdated 名称变化
beforeDestroy onBeforeUnmount 名称变化(destroy → unmount)
destroyed onUnmounted 名称变化(destroyed → unmounted)
errorCaptured onErrorCaptured 名称变化

二、图解Vue3生命周期

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Vue 3 生命周期流程图                       │
│                                                             │
│  <script setup> 执行                                         │
│        ↓                                                    │
│  onBeforeMount  ← 挂载前                                     │
│        ↓                                                    │
│  onMounted       ← 挂载完成(可以操作 DOM)                   │
│        ↓                                                    │
│     数据变化                                                 │
│        ↓                                                    │
│  onBeforeUpdate  ← 更新前                                    │
│        ↓                                                    │
│  onUpdated       ← 更新完成                                  │
│        ↓                                                    │
│     组件卸载                                                 │
│        ↓                                                    │
│  onBeforeUnmount ← 卸载前(清理工作)                         │
│        ↓                                                    │
│  onUnmounted     ← 卸载完成                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、为什么组合式 API 没有 beforeCreate 和 created?

javascript 复制代码
<script setup>
// 这个区域里的代码,就相当于在 created 阶段执行
// 所以不需要单独的 beforeCreate 和 created 钩子

import { ref, onMounted } from 'vue'

// 这里的代码相当于 created
const count = ref(0)
const message = ref('Hello')

// 这个相当于 mounted
onMounted(() => {
  console.log('DOM 已挂载')
})
</script>

四、created 详解

3.1 执行时机

组件实例刚创建好,数据初始化完成,但页面还没渲染。

javascript 复制代码
export default {
  data() {
    return {
      message: 'Hello',
      users: []
    }
  },
  created() {
    // 此时可以访问 data、props、methods
    console.log(this.message)  // 'Hello' ✅
    console.log(this.users)    // [] ✅
    this.fetchData()           // 可以调用 methods ✅
    
    // 但拿不到 DOM
    console.log(this.$el)      // undefined ❌
    document.getElementById('app')  // 找不到 ❌
  }
}

3.2 能做什么?

能做 说明
✅ 访问 data 数据已初始化
✅ 访问 props 父组件数据已传入
✅ 调用 methods 方法已挂载
✅ 发送请求 获取后端数据
✅ 设置定时器 初始化定时任务
✅ 访问 computedwatch 计算属性和侦听器已就绪

3.3 不能做什么?

不能做 原因
❌ 操作 DOM DOM 还没渲染
❌ 获取元素宽高 元素不存在
❌ 初始化需要 DOM 的插件 ECharts、Swiper 等需要 DOM 容器

五、mounted 详解

4.1 执行时机

组件已经渲染到页面上,DOM 已生成,可以安全操作 DOM。

javascript 复制代码
export default {
  mounted() {
    // 此时可以访问 DOM
    console.log(this.$el)           // DOM 元素 ✅
    console.log(this.$refs.box)     // ref 引用 ✅
    
    // 可以操作 DOM
    const height = this.$el.offsetHeight  // 获取高度 ✅
    this.$refs.input.focus()              // 聚焦输入框 ✅
  }
}

4.2 能做什么?

能做 说明
✅ 操作 DOM 获取、修改 DOM 元素
✅ 获取元素尺寸 offsetWidthgetBoundingClientRect()
✅ 初始化图表 ECharts、Three.js 等
✅ 初始化第三方库 Swiper、DatePicker 等
✅ 聚焦输入框 input.focus()
✅ 发送请求 也可以,但更推荐 created

Q1:Vue 3 有哪些生命周期函数?

答:

  • onBeforeMountonMounted

  • onBeforeUpdateonUpdated

  • onBeforeUnmountonUnmounted

  • onErrorCaptured

注意:组合式 API 中没有 beforeCreatecreated,因为 <script setup> 中的代码就相当于在 created 阶段执行。

Q2:Vue 2 和 Vue 3 生命周期有什么区别?

答:

  1. beforeDestroyonBeforeUnmount

  2. destroyedonUnmounted

  3. 组合式 API 中移除了 beforeCreatecreated

  4. 所有生命周期函数前加上 on 前缀

Q3:onMounted 和 onUpdated 有什么区别?

答:

  • onMounted:组件首次挂载完成后执行,只执行一次

  • onUpdated:组件每次更新后执行,会执行多次

Q4:created 和 mounted 的区别?

答:

  • created:组件实例创建完成,数据已初始化,但 DOM 还未渲染,不能操作 DOM

  • mounted:组件已挂载到页面,DOM 已生成,可以安全操作 DOM

两者都可以发请求,但操作 DOM 相关的代码(如初始化图表、获取元素尺寸)必须放在 mounted。

Q5:什么时候用 created?什么时候用 mounted?

答:

  • created:只需要初始化数据、发请求、设置定时器,不涉及 DOM 操作

  • mounted:需要操作 DOM、获取元素尺寸、初始化第三方库(ECharts、Swiper)

Q6:created 和 mounted 都能发请求,有什么区别?

答:

  • created:发请求更早,数据回来时 DOM 可能还没渲染,但不影响数据更新

  • mounted:发请求稍晚,但能确保 DOM 已存在

两者都可以,但更推荐在 created 发请求,可以更早获取数据。

相关推荐
浪客川2 小时前
【百例RUST - 007】结构体
java·前端·rust
美狐美颜sdk2 小时前
视频平台如何实现实时美颜?Android/iOS直播APP美颜SDK接入指南
android·前端·人工智能·ios·音视频·第三方美颜sdk·视频美颜sdk
ZHENGZJM2 小时前
前端流式通信 Hook:useBlogStream 详解
前端·全栈开发
人道领域2 小时前
【黑马点评日记02】Redis解决Tomcat集群Session共享问题
java·前端·后端·架构·tomcat·firefox
MRDONG12 小时前
从 Prompt 到智能体:深入理解 APE、Active-Prompt、DSP、PAL、ReAct 与 Reflexion
前端·react.js·prompt
翻斗包菜2 小时前
实战:使用 HAProxy 搭建高可用 Web 负载均衡集群
运维·前端·负载均衡
Irene19912 小时前
Python 学习途径,从熟悉的 JavaScript 过渡到 Python
javascript·python
凯强同学2 小时前
不上班,想裸辞,可以不可以?
服务器·前端·javascript
吹个口哨写代码2 小时前
h5/小程序直接读本地/在线的json文件数据
前端·小程序·json