vue3和vue2的生命周期,以及各种的使用时机和场景区别以及父子组件之间生命周期的执行顺序进去总结

Vue 3 与 Vue 2 的生命周期有很多相似之处,但也有明显的变化。Vue 3 对生命周期钩子做了重命名和优化,使得生命周期更加灵活,特别是在组合式 API 中。以下是 Vue 3 和 Vue 2 的生命周期对比、使用时机、以及常见使用场景。


Vue 2 生命周期

在 Vue 2 中,生命周期钩子如下:

  1. beforeCreate:实例刚创建时调用,数据和事件还未初始化。
  2. created:实例创建完成,数据和事件已完成初始化,但尚未挂载到 DOM 上。
  3. beforeMount:模板已经编译,挂载前调用,DOM 还未渲染。
  4. mounted:实例挂载完成,模板编译生成的 DOM 已插入页面。
  5. beforeUpdate:响应式数据更新时触发,DOM 尚未更新。
  6. updated:组件 DOM 更新完成后调用。
  7. activated:<keep-alive> 组件激活时调用。
  8. deactivated:<keep-alive> 组件停用时调用。
  9. beforeDestroy:组件销毁前调用。
  10. destroyed:组件销毁完成。

Vue 3 生命周期

Vue 3 的生命周期与 Vue 2 类似,但重命名了一些钩子以适应组合式 API。以下是 Vue 3 的生命周期钩子:

  1. setup:组合式 API 的初始化阶段,用于创建响应式数据、定义方法等。
  2. onBeforeMount(相当于 Vue 2 的 beforeMount):DOM 未挂载。
  3. onMounted(相当于 Vue 2 的 mounted):DOM 已挂载。
  4. onBeforeUpdate(相当于 Vue 2 的 beforeUpdate):数据更新,DOM 未更新。
  5. onUpdated(相当于 Vue 2 的 updated):数据更新后 DOM 已更新。
  6. onBeforeUnmount(相当于 Vue 2 的 beforeDestroy):组件销毁前。
  7. onUnmounted(相当于 Vue 2 的 destroyed):组件销毁后。
  8. onActivated:<keep-alive> 组件激活。
  9. onDeactivated:<keep-alive> 组件停用。

此外,Vue 3 引入了一些新的生命周期钩子函数,提供更灵活的控制:

  • onRenderTracked:用于追踪组件的渲染依赖。
  • onRenderTriggered:当组件重新渲染时触发,调试渲染性能非常有用。

使用时机与场景

1. 数据初始化:created(Vue 2) / setup(Vue 3)
  • Vue 2created 阶段用于初始化数据、调用 API 等操作。
  • Vue 3:在组合式 API 中使用 setup,可以直接定义 refreactive 变量,同时可以进行异步操作,如调用 API 获取数据。

示例:

// Vue 2
created() {
  this.fetchData();
}

// Vue 3
<script setup>
import { ref, onMounted } from 'vue';

const data = ref(null);
async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  data.value = await response.json();
}

fetchData();
</script>
2. DOM 操作:mounted

mounted 钩子在 Vue 2 和 Vue 3 中都有,但 Vue 3 中的组合式 API 使用 onMounted

  • Vue 2:可以在 mounted 中直接获取 DOM 节点。
  • Vue 3:通过 onMounted 钩子进行 DOM 操作,适合对渲染后的 DOM 进行操作。

示例:

// Vue 2
mounted() {
  this.$refs.myElement.focus();
}

// Vue 3
<script setup>
import { onMounted, ref } from 'vue';

const myElement = ref(null);

onMounted(() => {
  myElement.value.focus();
});
</script>

<template>
  <input ref="myElement" />
</template>
3. 组件更新:updatedbeforeUpdate
  • Vue 2beforeUpdateupdated 钩子分别在更新前和更新后触发,适用于需要监听和处理数据变化的情况。
  • Vue 3:通过 onBeforeUpdateonUpdated 实现类似效果。

示例:

// Vue 2
beforeUpdate() {
  console.log('组件即将更新');
},
updated() {
  console.log('组件已更新');
}

// Vue 3
import { onBeforeUpdate, onUpdated } from 'vue';

onBeforeUpdate(() => {
  console.log('组件即将更新');
});

onUpdated(() => {
  console.log('组件已更新');
});
4. 组件销毁:beforeDestroydestroyed(Vue 2) / onBeforeUnmountonUnmounted(Vue 3)
  • Vue 2:在 beforeDestroy 中可以做一些清理工作,比如移除事件监听器或销毁定时器。
  • Vue 3onBeforeUnmountonUnmounted 用于相同场景,且支持组合式 API 的写法。

示例:

// Vue 2
beforeDestroy() {
  window.removeEventListener('resize', this.handleResize);
},
destroyed() {
  console.log('组件已销毁');
}

// Vue 3
import { onBeforeUnmount, onUnmounted } from 'vue';

function handleResize() {
  console.log('窗口大小变化');
}

window.addEventListener('resize', handleResize);

onBeforeUnmount(() => {
  window.removeEventListener('resize', handleResize);
});

onUnmounted(() => {
  console.log('组件已销毁');
});
5. 依赖追踪:onRenderTrackedonRenderTriggered(Vue 3 特有)

Vue 3 新增的 onRenderTrackedonRenderTriggered,适合在调试中使用,帮助开发者了解组件渲染的依赖关系,找出潜在性能问题。

示例:

import { onRenderTracked, onRenderTriggered } from 'vue';

onRenderTracked((e) => {
  console.log('依赖追踪:', e);
});

onRenderTriggered((e) => {
  console.log('触发渲染:', e);
});

Vue 3 和 Vue 2 生命周期钩子的总结对比

功能Vue 2 生命周期Vue 3 生命周期(组合式 API)使用场景
数据初始化createdsetup初始化数据、调用 API
初次渲染beforeMount / mountedonBeforeMount / onMountedDOM 操作、动画
数据更新beforeUpdate / updatedonBeforeUpdate / onUpdated监听和响应数据变化
组件销毁beforeDestroy / destroyedonBeforeUnmount / onUnmounted清理定时器、事件监听
依赖追踪不适用onRenderTracked / onRenderTriggered调试性能问题

在 Vue 3 中,组合式 API 带来了更高的灵活性,支持更加简洁的生命周期钩子函数,同时还允许在 setup 阶段完成更多初始化工作。

在 Vue 中,父子组件的生命周期钩子执行顺序在组件创建、更新、销毁的过程中有不同的执行方式。了解父子组件的生命周期钩子执行顺序有助于在复杂组件间的状态传递、事件监听等操作中更好地控制和优化代码。

父子组件生命周期钩子执行顺序

以下是 Vue 3 和 Vue 2 中父子组件的生命周期钩子执行顺序的对比说明。


1. 组件的创建过程

在组件创建时,Vue 3 和 Vue 2 的父子组件生命周期钩子的执行顺序是相同的,遵循“父 beforeCreate -> 子 beforeCreate -> 子 created -> 父 created”的方式。详细执行顺序如下:

  • 父组件的 beforeCreate:父组件实例刚创建,数据和事件尚未初始化。
  • 父组件的 created:父组件实例已创建完成,数据和事件初始化完成。
  • 子组件的 beforeCreate:子组件实例创建。
  • 子组件的 created:子组件初始化完成。
  • 子组件的 beforeMount:模板编译完成,但 DOM 未挂载。
  • 子组件的 mounted:子组件完成挂载,DOM 插入页面。
  • 父组件的 beforeMount:父组件模板编译完成,准备挂载。
  • 父组件的 mounted:父组件挂载完成,整个组件树的初次渲染完成。

总结执行顺序:

  • beforeCreate -> 父 created
  • beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted
  • beforeMount -> 父 mounted

示例代码:

<!-- ParentComponent.vue -->
<template>
  <div>
    <p>Parent Component</p>
    <ChildComponent />
  </div>
</template>

<script setup>
import ChildComponent from './ChildComponent.vue';

onBeforeMount(() => console.log('Parent beforeMount'));
onMounted(() => console.log('Parent mounted'));
</script>
<!-- ChildComponent.vue -->
<template>
  <p>Child Component</p>
</template>

<script setup>
onBeforeMount(() => console.log('Child beforeMount'));
onMounted(() => console.log('Child mounted'));
</script>

输出顺序:

  1. Parent beforeCreate
  2. Parent created
  3. Child beforeCreate
  4. Child created
  5. Child beforeMount
  6. Child mounted
  7. Parent beforeMount
  8. Parent mounted

2. 组件更新过程

在组件更新过程中,由于子组件的变化会影响父组件,所以更新顺序从“父 beforeUpdate”开始。

  • 父组件的 beforeUpdate:父组件的响应式数据更新后,准备重新渲染。
  • 子组件的 beforeUpdate:子组件的响应式数据更新,准备重新渲染。
  • 子组件的 updated:子组件更新完成,新的 DOM 已插入。
  • 父组件的 updated:父组件更新完成。

总结执行顺序:

  • beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated

示例代码:

在以下示例中,父组件中的 counter 变化会触发父子组件的更新。

<!-- ParentComponent.vue -->
<template>
  <div>
    <p>Parent Component: {{ counter }}</p>
    <button @click="increment">Increment</button>
    <ChildComponent :counter="counter" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const counter = ref(0);
const increment = () => counter.value++;

onBeforeUpdate(() => console.log('Parent beforeUpdate'));
onUpdated(() => console.log('Parent updated'));
</script>
<!-- ChildComponent.vue -->
<template>
  <p>Child Component: {{ counter }}</p>
</template>

<script setup>
import { toRef } from 'vue';
const props = defineProps({ counter: Number });

onBeforeUpdate(() => console.log('Child beforeUpdate'));
onUpdated(() => console.log('Child updated'));
</script>

输出顺序(点击按钮后):

  1. Parent beforeUpdate
  2. Child beforeUpdate
  3. Child updated
  4. Parent updated

3. 组件销毁过程

当父组件或子组件被销毁时,它们的生命周期钩子执行顺序为“父 beforeUnmount -> 子 beforeUnmount -> 子 unmounted -> 父 unmounted”。

  • 父组件的 beforeUnmount:父组件销毁前触发。
  • 子组件的 beforeUnmount:子组件销毁前触发。
  • 子组件的 unmounted:子组件销毁完成。
  • 父组件的 unmounted:父组件销毁完成。

总结执行顺序:

  • beforeUnmount -> 子 beforeUnmount -> 子 unmounted -> 父 unmounted

示例代码:

在以下示例中,点击按钮销毁子组件。

<!-- ParentComponent.vue -->
<template>
  <div>
    <p>Parent Component</p>
    <button @click="toggleChild">Toggle Child</button>
    <ChildComponent v-if="showChild" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const showChild = ref(true);
const toggleChild = () => showChild.value = !showChild.value;

onBeforeUnmount(() => console.log('Parent beforeUnmount'));
onUnmounted(() => console.log('Parent unmounted'));
</script>
<!-- ChildComponent.vue -->
<template>
  <p>Child Component</p>
</template>

<script setup>
onBeforeUnmount(() => console.log('Child beforeUnmount'));
onUnmounted(() => console.log('Child unmounted'));
</script>

输出顺序(销毁子组件后):

  1. Parent beforeUnmount
  2. Child beforeUnmount
  3. Child unmounted
  4. Parent unmounted

总结

生命周期阶段Vue 2 执行顺序Vue 3 执行顺序(组合式 API)
创建过程beforeCreate -> 父 created -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 beforeMount -> 父 mounted相同
更新过程beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated相同
销毁过程beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyedbeforeUnmount -> 子 beforeUnmount -> 子 unmounted -> 父 unmounted
  • Vue 3 在销毁阶段,重命名了销毁相关的生命周期钩子为 onBeforeUnmountonUnmounted,并支持组合式 API。
  • 父子组件的生命周期顺序在组件创建、更新和销毁阶段的钩子触发顺序在 Vue 3 和 Vue 2 中是基本一致的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++(友元、异常机制、静态成员、单例模式)

友元 友元可以访问与其好友关系的类中的私有成员&#xff0c;使用friend关键字进行修饰。&#xff08;友元破坏了类的封装性&#xff09;。 特点 &#xff08;1&#xff09;友元是单向的 &#xff08;2&#xff09;友元不能传递 &#xff08;3&#xff09;友元…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

ElementUI中el-table双击单元格显示输入框

效果图 实现 <el-table:data"formData.products"row-key"id":show-header"true"style"width: 100%; margin-top: 16px"class"zq-table-theme-info"bordercell-dblclick"handleDbClick"> <el-table-col…

强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法

在当今的大模型时代&#xff0c;以 RLHF 为代表的强化学习方法具有无可替代的重要性&#xff0c;甚至成为了 OpenAI ο1 等模型实现强大推理能力的关键。 但这些强化学习方法仍有改进空间。近日&#xff0c;强化学习之父、阿尔伯塔大学教授 Richard Sutton 的团队低调更新了一…

一台手机可以登录运营多少个TikTok账号?

很多TikTok内容创作者和商家通过运营多个账号来实现品牌曝光和产品销售&#xff0c;这种矩阵运营方式需要一定的技巧和设备成本&#xff0c;那么对于很多新手来说&#xff0c;一台手机可以登录和运营多少个TikTok账号呢&#xff1f; 一、运营TikTok账号的数量限制 TikTok的官…

Rembg模型构建教程

一、介绍 Rembg&#xff0c;全称为“Remove Background”&#xff0c;是一款基于深度学习的图像背景去除工具。它的主要功能是通过智能识别图像中的前景物体&#xff0c;并将其从背景中分离出来&#xff0c;从而创建具有透明背景的图像。 二、基础环境 系统&#xff1a;Ubun…

AI直播带货场景切换模块的搭建!

AI直播带货&#xff0c;作为电商领域的新宠&#xff0c;正以其独特的魅力和高效的营销手段&#xff0c;引领着销售模式的新变革。 在AI直播带货中&#xff0c;场景切换模块是不可或缺的一部分&#xff0c;它不仅能够提升观众的观看体验&#xff0c;还能更好地展示商品&#xf…

力扣每日一题2024/11/2 3226. 使两个整数相等的位更改次数

class Solution:def minChanges(self, n: int, k: int) -> int:binary_n format(n, b)binary_k format(k, b)res0# 将两个二进制字符串长度对齐&#xff0c;前面补零max_len max(len(binary_n), len(binary_k))binary_n binary_n.zfill(max_len)binary_k binary_k.zfil…

.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)

一、前端界面小基础 head&#xff1a;引入CSS, 引入JS是写在head里面。 body&#xff1a;眼睛肉眼能看到的用户展示的界面是写在body里面。 二、前端怎么派人去拿数据&#xff1f; 1、MVC&#xff1a;前后端不分离&#xff0c;MVC相比WebApi只是多了一个views的文件夹 &am…

虚拟现实与增强现实:重塑娱乐和教育的边界!

内容概要 在这个瞬息万变的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;正如两位魔法师&#xff0c;腾云驾雾间掀起了一场教育与娱乐的革命。虚拟现实带我们飞跃平凡&#xff0c;进入一个充满奇迹的数字宇宙&#xff0c;仿佛我们…

Win10搭建SFTP服务器

1、下载安装 Release v9.5.0.0p1-Beta PowerShell/Win32-OpenSSH GitHub 下载OpenSSH-Win64.zip 解压之后放入到&#xff1a;C:\Program Files (x86)\OpenSSH-Win64以管理员身份打开CMD进入到 C:\Program Files (x86)\OpenSSH-Win64 文件夹执行命令 powershell.exe -Exec…

NNLM——预测下一个单词

一、原理篇 NNLM&#xff08;Neural Network Language Model&#xff0c;神经网络语言模型&#xff09;是一种通过神经网络进行语言建模的技术&#xff0c;通常用于预测序列中的下一个词。 NNLM的核心思想是使用词嵌入&#xff08;word embedding&#xff09;将词转换为低维向…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (4) - 平台适配

在移植 AWTK 到 HarmonyOS NEXT 系统之前&#xff0c;我们需要先完成平台适配&#xff0c;比如文件、多线程&#xff08;线程和同步&#xff09;、时间、动态库和资源管理。 1. 文件 HarmonyOS NEXT 支持标准的 POSIX 文件操作接口&#xff0c;我们可以直接使用下面的代码&am…

TON 区块链开发的深入概述#TON链开发#DAPP开发#交易平台#NFT#Gamefi链游

区块链开发领域发展迅速&#xff0c;各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON&#xff08;开放网络&#xff09;区块链。TON 区块链最初由 Telegram 构思&#xff0c;旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…

【机器学习】27. 马尔科夫链和隐马模型HMM

马尔科夫链和隐马模型HMM 1. Markov chain2. 计算3. Hidden Markov Model4. 两个假设5. 问题1&#xff1a;evaluation6. Forward 算法7. 问题2&#xff1a;Decoding8. Viterbi算法9. 问题3&#xff1a;Learning10. 期望最大化算法Expectation Maximization 1. Markov chain 马…

向量和矩阵的范数

一般&#xff0c;实数的绝对值来表示“实数”的大小&#xff1b;复数的模来表示复数的大小。这在实际应用中&#xff0c;带来了非常大的便利。 对于一个平面向量 a a a ,当其在直角坐标系中的分量分别为 x 0 x_0 x0​和 y 0 y_0 y0​时&#xff0c;我们常用 x 0 2 y 0 2 \sq…

树莓派开发相关知识七 -串口数码管

1、概述 一个普通的数码管实际上为71个LED灯。 上图可知&#xff0c;A-G加上DP点8个LED&#xff0c;通过不同的亮暗来显示出所需的数字。 如果同时要控制多个数码管&#xff0c;则需要的GPIO未免太多。 我们选择控制4个数码管&#xff0c;通过串行转并行的方式实现控制。 所…

基于IMX6ULL的电子产品量产工具

参考博客&#xff1a; https://blog.csdn.net/m0_63168877/article/details/138545059一、设计思路 软件框架及目录 二、显示系统 2.1显示管理器框架 2.2DispOpr 结构体 在disp_manager.h这一层抽象出显示结构体 在底层显示模块分配、设置这个结构体&#xff0c;并且向本层…

React 中使用 Redux Toolkit 状态管理

在现代 React 应用程序中&#xff0c;状态管理是一个至关重要的部分。使用 Redux Toolkit 可以简化 Redux 的配置和管理。本文将通过三个文件的示例&#xff0c;详细讲解如何使用 Redux Toolkit 创建和管理一个简单的计数器状态&#xff0c;并通过类比源 store 和根 store 的概…

3、liunx系统网络配置

一、liunx网络配置 Linux服务器网卡默认配置文件在/etc/sysconfig/network-scripts/下&#xff0c;命名的名称一般为:ifcfg-eth0 ifcfg-eth1 &#xff0c;eth0表示第一块网卡&#xff0c;eth1表示第二块网卡&#xff0c;依次类推&#xff0c;例如DELL R720标配有4块千兆网卡&am…