Vue3 生命周期

Vue3 生命周期

  • [1. 理解什么是生命周期(组件的创建、挂载、更新和销毁过程)](#1. 理解什么是生命周期(组件的创建、挂载、更新和销毁过程))
  • [2. 快速入门(onMounted 的使用)](#2. 快速入门(onMounted 的使用))
  • [3. Vue3 生命周期钩子(目前共12个)](#3. Vue3 生命周期钩子(目前共12个))
  • [4. 和 Vue2 生命周期的区别](#4. 和 Vue2 生命周期的区别)
    • [4.1 Vue2 的主要生命周期](#4.1 Vue2 的主要生命周期)
    • [4.2 Vue3 的主要生命周期(对比Vue2)](#4.2 Vue3 的主要生命周期(对比Vue2))

1. 理解什么是生命周期(组件的创建、挂载、更新和销毁过程)

生命周期就是组件从创建到销毁的所经历的一系列过程。

这个过程中,设置了一些时间点,在这些时间点,开发者可设置一些函数进行事件处理(其实大部分就是业务逻辑代码)。而这些函数就被称为生命周期钩子。

Vue3 的生命周期,如图:

2. 快速入门(onMounted 的使用)

其实对于初学者而言,可以先不必掌握每一个生命周期,只要先了解最常用的 mounted 即可,对应的钩子函数为 onMounted。

因为该钩子函数会在完成了初始化渲染并且创建和插入了 DOM 节点之后被触发,这意味着在当前的这个时间节点,你是可以访问真实的 DOM 元素的。

示例代码:

javascript 复制代码
<template>
  <div>
    <h1>用户列表</h1>
    <ul v-if="!loading">
      <li v-for="(user, index) in users" :key="index">{{ user.name }} - {{ user.email }}</li>
    </ul>
    <div v-if="loading">加载中...</div>
    <div v-if="error">出错啦!</div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const users = ref([])
const loading = ref(false)
const error = ref(null)

onMounted(async () => {
  // 一般来讲,我们会在此生命周期钩子方法中请求数据
  loading.value = true
  try {
    const res = await fetch('https://jsonplaceholder.typicode.com/users')
    if (res.ok) {
      users.value = await res.json()
    } else {
      throw new Error('请求失败')
    }
  } catch (err) {
    error.value = err.message
  } finally {
    // 无论是出错也好,还是正常请求到了数据,都需要将 loading 状态改为 false
    loading.value = false
  }
})
</script>

<style scoped></style>

3. Vue3 生命周期钩子(目前共12个)

详情请查看官网 组合式 API:生命周期钩子,这里进行简要说明。

比较常用的有

  • onBeforeMount() 注册一个钩子,在组件被挂载之前被调用。

  • onMounted() 注册一个回调函数,在组件挂载完成后执行。

  • onBeforeUpdate() 注册一个钩子,在组件即将因为响应式状态变更而更新其 DOM 树之前调用。

  • onUpdated() 注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。

  • onBeforeUnmount() 注册一个钩子,在组件实例被卸载之前调用。

  • onUnmounted() 注册一个回调函数,在组件实例被卸载之后调用。

  • onActivated() 注册一个回调函数,若组件实例是 缓存树的一部分,当组件被插入到 DOM 中时调用。

  • onDeactivated() 注册一个回调函数,若组件实例是 缓存树的一部分,当组件从 DOM 中被移除时调用。

  • onErrorCaptured() 注册一个钩子,在捕获了后代组件传递的错误时调用。

  • onRenderTracked() (Dev only)注册一个调试钩子,当组件渲染过程中追踪到响应式依赖时调用。

  • onRenderTriggered() (Dev only)注册一个调试钩子,当响应式依赖的变更触发了组件渲染时调用。

  • onServerPrefetch() (SSR only)注册一个异步函数,在组件实例在服务器上被渲染之前调用。

4. 和 Vue2 生命周期的区别

在 Vue.js 中,无论是 Vue 2 还是 Vue 3,生命周期钩子函数的概念和用途大体相同,但它们在实现和细节上有所不同。

如果纯粹只按照组件的创建、挂载、更新、卸载 4个阶段的前后来区分的话,应该可以衍生出8个生命周期及其钩子函数。事实上,Vue2确实也是这么做的。

4.1 Vue2 的主要生命周期

Vue2 的主要生命周期有8个,名称和对应的钩子函数一致。详情建议参考我之前写的一篇《如何理解Vue实例的生命周期》,有 Vue2 生命周期极为详细的说明和实例。

(1)beforeCreate(创建前)

这是遇到的第一个生命周期函数,表示Vue实例完全被创建出来前,会执行它,此时data和methods中的数据都还没初始化。

(2)created(创建后)

data和methods中的数据已经初始化完成可以进行调用。

(3)beforeMount(挂载前)

模板在内存中已经编译完成,但是尚未渲染到页面中,此时页面中的元素还未替换,只是之前写的一些模板字符。

(4)mounted(挂载后)

内存中的模板已经完全渲染到页面中,模板字符在页面中被替换成真正对应的变量。

(5)beforeUpdate(更新前)

data 中的数据发生改变,页面中的显示数据还是旧的,此时data数据是最新的,页面还未和数据保持同步。

(6)updated(更新后)

页面和data数据已经保持同步了,都是最新的。

(7)beforeDestroy(销毁前)

Vue实例已经从运行阶段进入到了销毁阶段。此时Vue实例上所有的data和所有的methods,以及过滤器、指令等都还处于可用状态,此时还没有真正执行销毁的过程。

(8)destroyed(销毁后)

组件已经完全销毁了;此时Vue实例上所有的data和所有的methods,以及过滤器、指令等都已经不可用了。

4.2 Vue3 的主要生命周期(对比Vue2)

(1)setup(组合时API的入口,在beforeCreate之前)

(2)beforeCreate(技术上存在,但弃用)

(3)created(技术上存在,但弃用)

(4)beforeMount(没变化)

(5)mounted(没变化)

(6)beforeUpdate(没变化)

(7)updated(没变化)

(8)beforeUnmount(对应 beforeDestroy)

(9)unmounted(对应destroyed)

主要差异点:

(1)Composition API‌ : Vue 3 通过引入 Composition API ,推荐使用 setup() 函数替代了 beforeCreate 和 created(虽然在技术上 beforeCreate 和 created 在 Vue 3 中仍然存在,但官方推荐使用 setup())。setup() 在 beforeCreate 和 created 之前被调用。

(2)新增周期 : Vue 3 新增了 beforeUnmount 和 unmounted,这两个钩子分别替代了 Vue 2 中的 beforeDestroy 和 destroyed。更加清晰地对应之前的 beforeMount 和 mounted 两个生命周期。

(3)除了 setup,Vue3 的生命周期钩子,都在前面加了on,用于区别 Vue2的生命周期钩子。

(4)性能优化‌: Vue 3 对生命周期钩子的实现进行了优化,以提高性能和响应性。例如,通过使用更高效的依赖追踪系统。

总的来说,Vue 3 在保持大部分生命周期钩子的同时,通过引入 Composition API 和一些新的生命周期钩子来改进和扩展了其功能。开发者可以根据自己的项目需求和偏好选择使用选项式 API 或 Composition API 来开发应用。


上一章 《Vue3 模板引用------ref》

下一章 《Vue3 组件注册》

相关推荐
格数致用3 天前
03- Luckysheet与Vue3+Electron集成实战指南
electron·vue3·luckysheet
陪我一起学编程9 天前
vue3笔记
前端·webpack·vue3·vite·脚手架·vue3笔记·组件式
拔剑纵狂歌10 天前
ClickHouse system.query_log 字段详解与排障实践
后端·clickhouse·1024程序员节
Json____12 天前
家居装修 AI 智能咨询助手:让装修咨询从“大海捞针“变成“一问即答“
java·后端·vue3·it学习·wwwoop.com
liangshanbo121513 天前
面试题:什么是 Reflect?它解决了什么问题?
vue3·reflect
RuoyiOffice13 天前
SpringBoot3+Vue3 低代码业务表单:从拖拽设计、独立建表到审批与数据查询
spring boot·vue3·数据建模·flowable·版本管理·低代码表单·ruoyi office
RuoyiOffice13 天前
SpringBoot3 企业薪酬核算:考勤、绩效与薪资规则如何算出一张可解释的工资单
spring boot·vue3·规则引擎·hrm·ruoyi office·薪酬核算·薪资试算
RuoyiOffice19 天前
2026最推荐基于SpringBoot+Vue3的项目管理经营一体化:从商机、合同、任务与工时走到回款和利润
spring boot·项目管理·vue3·crm·合同管理·ruoyi office·项目经营
RuoyiOffice20 天前
SpringBoot+Vue3 节日主题换肤实战:一条参数换全站配色,节后自动还原
spring boot·vue3·spring boot 3·vben admin·ruoyi office·节日主题·换肤方案
RuoyiOffice22 天前
SpringBoot3+Vue3 流程抄送已读:打开详情消红点,待办与知会怎么分开
spring boot·vue3·flowable·spring boot 3·ruoyi office·流程抄送·已读回执