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() 函数替代了 beforeCreatecreated(虽然在技术上 beforeCreatecreatedVue 3 中仍然存在,但官方推荐使用 setup())。setup() 在 beforeCreate 和 created 之前被调用。

(2)新增周期 : Vue 3 新增了 beforeUnmountunmounted,这两个钩子分别替代了 Vue 2 中的 beforeDestroydestroyed。更加清晰地对应之前的 beforeMountmounted 两个生命周期。

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

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

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


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

下一章 《Vue3 组件注册

相关推荐
小二·4 小时前
npm使用国内淘宝镜像的方法
npm·1024程序员节
TDengine (老段)4 小时前
TDengine 数学函数 SQRT 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
Cl_rown去掉l变成C4 小时前
N8周打卡:使用Word2vec实现文本分类
1024程序员节
顧棟5 小时前
【Flink实战】升级HDFS,对Flink SQL(On Yarn模式)的功能兼容性验证
hadoop·flink·1024程序员节
2501_938782096 小时前
《Hive 分区裁剪与并行查询:如何让并行任务只处理必要数据》
1024程序员节
使者大牙6 小时前
释放内存与加速推理:PyTorch的torch.no_grad()与torch.inference_mode()
1024程序员节
mailangduoduo6 小时前
残差网络的介绍及ResNet-18的搭建(pytorch版)
人工智能·深度学习·残差网络·卷积神经网络·分类算法·1024程序员节
不去幼儿园9 小时前
【启发式算法】狼群算法(WPA)与灰狼算法(GWO)轻解
1024程序员节
前端 贾公子10 小时前
手写 Vuex4 源码(上)
1024程序员节