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 组件注册

相关推荐
u01030552717 小时前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055271 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝3 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055273 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055273 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055276 天前
Java实用类应用精讲
人工智能·1024程序员节
u0103055276 天前
Java I/O核心操作实战
人工智能·1024程序员节
java1234_小锋6 天前
Vue3专题 - 响应式基础
vue·vue3·响应式
u0103055277 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u0103055278 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节