vue3 生命周期钩子

news2024/11/14 21:33:12

在 Vue 3 中,可以在组件不同阶段的生命周期执行特定逻辑。
生命周期整体分为四个阶段:创建挂载更新卸载

创建阶段

组合式APIsetup()

  • 这是组合式 API 的入口点,在组件实例创建之前被调用。
  • 在此阶段,可以初始化响应式数据、定义方法等。但不能使用 this,因为它不是传统选项式 API 的上下文。
  • 可以通过 import { reactive, ref } from 'vue'; 导入响应式函数来创建响应式数据。

挂载阶段

选项式APIonBeforeMount()

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

  • 作用
    • 通常用于在组件挂载之前进行一些初始化操作,这些操作不依赖于 DOM 元素的存在。
    • 例如,可以在这个阶段进行数据的预加载、初始化一些变量或者设置一些状态,为组件的挂载做好准备。
  • 执行时机
    • 在组件的 setup 函数执行之后,以及组件真正被挂载到 DOM 之前调用。
      当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点,不能访问到 DOM 元素。它即将首次执行 DOM 渲染过程。
  • 注意事项
    • onBeforeMount() 阶段,组件尚未被挂载到 DOM,所以无法直接访问 DOM 元素。
  • 这个钩子在服务器端渲染期间不会被调用

选项式APIonMounted()

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

  • 作用
    • 主要用于在组件被渲染并插入到 DOM 后,执行一些需要访问 DOM 元素或进行依赖 DOM 操作的任务。
    • 例如,可以在这个阶段初始化第三方库、设置元素的初始状态、添加事件监听器等。
  • 执行时机
    • 在组件挂载到 DOM 后调用。意味着在组件及组件的所有子组件都被挂载之后调用。可以确保在 onMounted 中访问子组件的 DOM 元素是安全的。
  • 组件在以下情况下被视为已挂载
    • 其所有同步子组件都已经被挂载 (不包含异步组件或 <Suspense> 树内的组件)。
    • 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。
  • 这个钩子在服务器端渲染期间不会被调用

更新阶段

选项式APIonBeforeUpdate()

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

  • 作用
    • 可以在这个阶段获取到组件更新前的状态,以便进行一些特定的处理或记录。
    • 例如,可以在这个阶段保存一些当前的状态信息,以便在更新后进行比较或恢复。
  • 执行时机
    • 当响应式数据发生变化,并且 Vue 检测到需要更新组件时,在实际更新之前调用onBeforeUpdate
  • 注意事项
    • onBeforeUpdate应该快速执行,避免进行耗时的操作,因为这可能会延迟组件的更新。
    • onBeforeUpdate通常与onUpdated一起使用,以便在更新前后进行相应的处理。
  • 这个钩子在服务器端渲染期间不会被调用

选项式APIonUpdated()

注册一个回调函数,在组件因为响应式状态变更而更新其 DOM 树之后调用。
在组件更新完成后执行。

  • 作用

    • 主要用于在组件的响应式数据变化导致重新渲染后执行一些操作。
    • 可以在这个阶段安全地访问和操作更新后的 DOM 元素。
  • 执行时机

    • 在组件的 DOM 更新完成后调用。
    • 父组件的更新钩子将在其子组件的更新钩子之后调用。
  • 注意事项

    • 不要在 updated 钩子中更改组件的状态,这可能会导致无限的更新循环!
    • 如果需要在某个特定的状态更改后访问更新后的 DOM,请使用 nextTick()
  • 这个钩子在服务器端渲染期间不会被调用

卸载阶段

选项式APIonBeforeUnmount()

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

  • 作用

    • 主要用于在组件被销毁之前进行一些清理操作,例如取消订阅事件、清除定时器、移除 DOM 事件监听器等,以避免内存泄漏和不必要的资源占用。
    • 可以在这个阶段保存一些组件的状态信息,以便在后续可能的重新创建中恢复。
  • 执行时机

    • 在组件即将被卸载,即从 DOM 中移除之前调用。此时组件的 DOM 元素仍然存在,可以被访问到。
  • 注意事项

    • 当这个钩子被调用时,组件实例依然还保有全部的功能。
    • onBeforeUnmount中进行清理操作时,要确保所有的资源都被正确地释放,以避免内存泄漏和其他潜在的问题。
    • 这个钩子函数应该快速执行,避免进行耗时的操作,因为这可能会延迟组件的卸载过程。
  • 这个钩子在服务器端渲染期间不会被调用

选项式APIonUnmounted()

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

  • 作用

    • 通常用于进行最后的清理工作,确认所有资源都已被正确释放,并且组件不再占用任何内存或资源。
    • 可以在这个阶段进行一些日志记录或其他与组件卸载相关的操作,以帮助调试和了解应用的运行状态。
  • 执行时机

    • 在组件的 DOM 元素被完全移除且所有相关的资源都已被清理后调用。
  • 一个组件在以下情况下被视为已卸载

    • 其所有子组件都已经被卸载。
    • 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。
  • 注意事项

    • onUnmounted中,组件的 DOM 元素已经被移除,无法再访问它们。
    • 确保在onUnmounted中进行的清理操作是完整的,避免留下任何潜在的内存泄漏或资源占用问题。
  • 这个钩子在服务器端渲染期间不会被调用

示例

父组件:

<template>
  <div>
    <ChildComponent />
  </div>
</template>

<script setup lang="ts" name="Parent">
import {
  onBeforeMount,
  onMounted,
} from 'vue';
import ChildComponent from './ChildComponent.vue';

console.log('父组件---- setup 在组件实例创建之前被调用')

// 挂载前
onBeforeMount(() => {
  console.log('父组件---- onBeforeMount 在组件被挂载之前被调用');
});

// 挂载完毕
onMounted(() => {
  console.log('父组件---- onMounted 在组件挂载完成后执行');
});

</script>

子组件:

<template>
  <div ref="divRef">{{ data }}</div>
  <button @click="changeData">修改数据</button>
</template>
<script setup lang="ts" name="ChildComponent">
import {
  onBeforeMount,
  onBeforeUnmount,
  onBeforeUpdate,
  onMounted,
  onUnmounted,
  onUpdated,
  ref
} from 'vue';

let divRef = ref()
let data = ref('hello Vue3 生命周期')

const changeData = () => {
  data.value = data.value + '!'
}

console.log('子组件---- setup 在组件实例创建之前被调用')

// 挂载前
onBeforeMount(() => {
  console.log('子组件---- onBeforeMount 在组件被挂载之前被调用');
  // 组件还未挂载,不能访问DOM
  console.log('子组件---- divRef.value:', divRef.value); // undefined
});

// 挂载完毕
onMounted(() => {
  console.log('子组件---- onMounted 在组件挂载完成后执行');
  // 组件已经挂载完毕
  console.log('子组件---- divRef.value:', divRef.value); // ref为divRef的DOM节点
});

// 更新前
onBeforeUpdate(() => {
  console.log('onBeforeUpdate 在 Vue 更新 DOM 之前访问 DOM 状态');
});

// 更新后
onUpdated(() => {
  console.log('onUpdated 在组件更新完成后执行');
});

// 卸载前
onBeforeUnmount(() => {
  console.log('onBeforeUnmount 在组件实例被卸载之前调用');
  // DOM 元素仍然存在,可以被访问到
  console.log('divRef.value:', divRef.value); // ref为divRef的DOM节点
});

// 卸载后
onUnmounted(() => {
  console.log('onUnmounted 在组件实例被卸载之后调用');
  // DOM 元素已经被移除,无法再访问
  console.log('divRef.value:', divRef.value); // undefined
});
</script>

控制台打印结果:
在这里插入图片描述
在 Vue 3 中,父子组件的生命周期钩子有一定的执行顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键批量查询邮政快递,物流状态尽在掌握

邮政快递批量查询&#xff0c;轻松掌握物流动态 在电商行业蓬勃发展的今天&#xff0c;邮政快递作为连接商家与消费者的桥梁&#xff0c;其物流信息的及时性和准确性对于提升客户体验至关重要。然而&#xff0c;面对海量的快递单号&#xff0c;如何高效地进行批量查询&#xf…

【最长上升子序列】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1010; int a[N], f[N]; int main() {int n;cin >> n;for(int i 1; i < n; i) cin >> a[i];int res 0;for(int i 1; i < n; i){f[i] 1;for(int j 1; j < i; j){if(a[j] &…

(贪心) LeetCode 135. 分发糖果

原题链接 一. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xf…

UE5 蓝图 计算当前时间段

思路&#xff1a; 那当前hour与阈值hour对比 。小于返回&#xff0c;大于就继续循环对比。 临时变量 折叠图表↓

快排之自省排序

introsort是introspective sort采⽤了缩写&#xff0c;他的名字其实表达了他的实现思路&#xff0c;他的思路就是进行⾃我侦测和反省&#xff0c;快排递归深度太深&#xff08;sgi stl中使⽤的是深度为2倍排序元素数量的对数值&#xff09;那就说明在这种数据序列下&#xff0c…

数据结构-栈与队列-数组和链表的推广运用-第六天

hello算法 1.数组和队列作为最基础的两种数据结构&#xff0c;区别主要在于&#xff1a; 1.数组是连续存储&#xff0c;因此可以利用一个开始节点的地址直接确定其他的节点地址。 2.链表未绑定的存储顺序&#xff0c;具有更灵活快捷的增删改查。 3.为了解决存储的问题&#xf…

【Simulink】使用简化机械臂系统动力学的抓取和放置任务及轨迹调度

abbSavedConfigs.mat 文件中的配置 文件中保存了多个关节角度配置&#xff0c;每个配置对应不同的机器人操作步骤。这些配置通常用于控制机器人在执行任务时的各个关键姿态和动作。 各个配置的功能解释&#xff1a; configSequence (18x7 double): 功能: 包含了机器人执行任…

外卖系统开发:如何打造一个无缝衔接的用户体验?

在如今高度竞争的外卖市场中&#xff0c;用户体验决定了一个外卖平台的成败。为了打造一个无缝衔接的用户体验&#xff0c;外卖系统的每一个环节都需要精心设计和优化&#xff0c;从用户下单到订单配送&#xff0c;每一步都必须顺畅无阻。本文将探讨如何通过技术手段和代码实现…

使用Python+os+fnmatch搜索文件和目录

一、搜索/home/Download目录下的zip压缩文件 import os from fnmatch import fnmatch# 搜索与pattern匹配的文件和目录 def find_file(pattern, path):result []for root, dirs, files in os.walk(path):for name in files:if fnmatch(name, pattern):result.append(os.path.…

R语言function快速掌握-自定义函数

R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作&#xff0c;但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。 在R语言中&#xff0c;function 是一个核心概念&#xff0c;它允许用户创建可重用的代码块来执行特定的…

【PHP报错已解决】‘/www/wwwroot/xxxxxx/public/../thinkphp/start.php‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 作为开发者&#xff0c;遇到报错信息是在所难免的。然而&#xff0c;有些报错信息可能会让我们感到困惑&…

每日OJ_牛客_淘宝网店(日期模拟)

目录 牛客_淘宝网店&#xff08;日期模拟&#xff09; 解析代码 牛客_淘宝网店&#xff08;日期模拟&#xff09; 淘宝网店__牛客网 解析代码 这是一个变相的日期计算器。只不过2、3、5、7、11月算1天&#xff0c;其他7个月算2天。 既然是一个变相的日期计算器&#xff0c;那…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 &#x1f608; 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷…

初出茅庐:怎样获得实习机会——之找到一份工作

如果你刚开始工作&#xff0c;找到工作的最好和最简单的方法之一就是【实习】&#xff1b;许多技术类公司只雇佣实习生或者经验丰富的软件开发者&#xff0c;实习为公司提供了一个独一无二的机会&#xff0c;使其可以在雇用潜在员工之前对他们进行充分的评估。但实习的机会不是…

Pytorch升级之旅——基础概念

目录 一、人工智能简史 三次浪潮 DL,ML,AI三者之间的关系 二、模型评价指标 混淆矩阵 Overall Accuracy ​编辑 Average accuracy Kappa系数 Recall Precision F1 PR曲线 置信度 IOU AP mAP 三、常用包Numpy、pandas、matplotlib Numpy pandas matplotlib…

二叉树【2】遍历

先中后序 先序遍历&#xff1a;根左右 中序遍历&#xff1a;左跟右 后序遍历&#xff1a;左右跟 例图 先序性质 中序性质 后序性质 先序中序确定二叉树 后序中序确定二叉树 先序后序不能确定。 层序&#xff1a;广度优先搜索 如果需要修改树的元素&#xff0c;则需no…

机器学习(第六关--文本特征抽取)

以下内容&#xff0c;皆为原创&#xff0c;制作实属不易&#xff0c;感谢大家的观看和关注。 在此真诚的祝愿大家&#xff0c;生活顺顺利利&#xff0c;身体健健康康&#xff0c;前途似锦。 第一关&#xff1a;机器学习概念和流程http://t.csdnimg.cn/IuHh4第二关&#xff1a;…

【功能实现】Vue3中导航栏效果实现

功能需求&#xff1a; 点击导航后会跳转到相应的页面当页面在顶部时&#xff0c;导航栏模块背景是透明的当页面向下滚动超过150px时&#xff0c;导航栏背景为白色 效果实现&#xff1a; 1.准备列表 将导航栏区域的类名设置为动态&#xff0c;即通过判断isTransparent是否存在…

浅谈【数据结构】链表之其他形态

目录 1、带头结点的链表 2、创建步骤 3、循环链表 3.1创建循环链表 3.2循环链表的遍历 3.3链表中的闭环 4、静态链表 4.1静态链表初始化 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#…

在群晖上安装Git客户端

什么是 Git &#xff1f; Git 是一个分布式版本控制系统&#xff0c;提供了命令行界面&#xff08;CLI&#xff09;以及图形用户界面&#xff08;GUI&#xff09;两种方式进行操作。与 CVS、Subversion 一类的集中式版本控制工具不同&#xff0c;它采用了分布式版本库的作法&am…