Vue2 与 Vue3 生命周期对比

news2024/11/15 18:24:07

首先我们需要了解 Vue2 的生命周期,请参考我之前写的博文 Vue2-生命周期

 Vue2 生命周期存在四个阶段,八个钩子函数,具体作用可以看图,详细解释可以参考之前的博文

Vue3 生命周期

经过对比,我们发现 Vue3 的生命周期也存在四个和 Vue2 完全一样的阶段,但是也存在一定的区别:

  1. 在销毁阶段的生命周期钩子函数改名了。
  2. 生命周期过程也存在部分变更。

配置式生命周期钩子函数对比

首先,这一块的内容叫做配置式生命周期钩子函数。之所以叫配置式,是因为我们采用的是和 Vue2 的生命周期一样的使用模式,同时也是为了和 Vue3 的组合式区分开来,组合式后面再开一part去讲,现在先讲讲配置式。

通过上面两幅图对比,我们可以很清楚的看到,Vue3 中关于组件销毁阶段和 Vue2 中不一致,分别是:

  1. 销毁前:beforeDestory ==> beforeMount
  2. 销毁后:destoryed ==> unmounted

然后就是整个生命周期流程也存在一定的改动:

  1. 初始化阶段:Vue2 通过 new Vue() 进行初始化。但是 Vue3 是先调用了 creatApp 创建了app 实例,并且传入了 el 属性,然后再去初始化。-- 这就导致了 在Vue3 中如果不传 el 属性,是无法进行下一步生命周期的,但是在Vue2 中,不传 el 属性,也可以继续往下走到 beforeMount
  2. created ==> beforeMount 阶段:Vue2 中进行了首先判断是否传递 el 属性,或者是否调用 $mount函数并传入 el 属性,然后再去判断是否传入 templete 模板。但是 Vue3 中只需要判断是否传入 templete 模板就行。这就和第一点呼应上了。因为 Vue3 最开始初始化就必须传入el属性,所以不用进行判断。 

组合式生命周期钩子函数对比

既然是组合式,那就说明和配置式肯定是存在区别的:

  1. 需要像之前的 computed 计算属性,watch监听器之类的一样,需要先引入,再使用。
  2. 所有组合式生命周期钩子函数都应该在组件的 setup() 阶段被同步调用

上面是 Vue3 的组合式生命周期钩子函数,经过对比,我们可以发现存在以下几点明细的区别

  1. 创建阶段:Vue2生命周期中的组件创建阶段( beforeCreate、created ),在Vue3 中被移除,取而代之的是 setup 函数。这表示在创建阶段的钩子函数中的逻辑可以直接在Vue3 的setup中编写。
  2. 挂载、更新、销毁、keep-alive、错误捕获阶段:生命周期过程不变,只是钩子函数名称发生变化
  3. 调试阶段:新增两个调试阶段的钩子,当依赖被调用或依赖更新时调用。

Vue3 配置式API 和 组合式API 对比

上面讲了Vue2 和 Vue3 的生命周期对比,然后我们来看看 Vue3 中配置式和组合式生命周期到底有什么区别

配置式组合式作用
beforeCreate
直接在 setup中执行
在实例初始化之后,数据观测 (reactivity) 和事件/生命周期处理之前被调用。在这个阶段,组件实例还没有完全初始化,dataprops 都不可用。
created
直接在 setup中执行
在实例创建完成后调用,此时组件的响应式系统已经建立,但还没有挂载到 DOM 上。在这个钩子中,可以访问并修改响应式数据、调用方法等。
beforeMount
onBeforeMount
当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程
mounted
onMounted
在组件挂载完成后执行,这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端执行。也就是操作 DOM
beforeUpdate
onBeforeUpdate
在组件即将因为响应式状态变更而更新其 DOM 树之前调用,在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。
updated
onUpdated
在组件因为响应式状态变更而更新其 DOM 树之后调用
beforeUnMount
onBeforeUnmount
在组件实例被卸载之前调用,当这个钩子被调用时,组件实例依然还保有全部的功能
unmounted
onUnmounted
组件实例被卸载之后调用,可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。
activated
onActivated
若组件实例是 <KeepAlive> 缓存树的一部分,当组件被插入到 DOM 中时调用。
deactivated
onDeactivated
若组件实例是 <KeepAlive> 缓存树的一部分,当组件从 DOM 中被移除时调用。
errorCaptured
onErrorCaptured
在捕获了后代组件传递的错误时调用
--
onRenderTracked
当组件渲染过程中追踪到响应式依赖时调用。这个钩子仅在开发模式下可用
--
onRenderTriggered
当响应式依赖的变更触发了组件渲染时调用。这个钩子仅在开发模式下可用
--
onServerPrefetch
在组件实例在服务器上被渲染之前调用,

如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。

这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。

 其中有一些钩子需要详细解释一下:

1、onMounted:组件挂载完成后执行,可以再此操作DOM。组件在以下情况下被视为已挂载:

  • 其所有同步子组件都已经被挂载 (不包含异步组件或 <Suspense> 树内的组件)。

  • 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。

  • 案例:通过 ref 操作 DOM

    // onMounted 钩子中 通过 ref 来操作DOM节点
    <script setup>
    import { ref, onMounted } from 'vue'
    
    const el = ref()
    
    onMounted(() => {
      el.value // <div>
    })
    </script>
    
    <template>
      <div ref="el"></div>
    </template>

2、onUpdated:在组件因为响应式状态变更而更新其 DOM 树之后调用

  • 父组件的更新钩子将在其子组件的更新钩子之后调用。
  •  这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的,因为多个状态变更可以在同一个渲染周期中批量执行 (考虑到性能因素)。如果你需要在某个特定的状态更改后访问更新后的 DOM,请使用 nextTick() 作为替代。

  • 不要在 updated 钩子中更改组件的状态,这可能会导致无限的更新循环!

  • 案例:访问更新后的 DOM
    <script setup>
    import { ref, onUpdated } from 'vue'
    
    const count = ref(0)
    
    onUpdated(() => {
      // 文本内容应该与当前的 `count.value` 一致
      console.log(document.getElementById('count').textContent)
    })
    </script>
    
    <template>
      <button id="count" @click="count++">{{ count }}</button>
    </template>

3、onUnmounted:组件实例被卸载之后调用。一个组件在以下情况下被视为已卸载:

  • 其所有子组件都已经被卸载。

  • 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。

  • 案例:清除定时器

    <script setup>
    import { onMounted, onUnmounted } from 'vue'
    
    let intervalId
    onMounted(() => {
      intervalId = setInterval(() => {
        // ...
      })
    })
    
    onUnmounted(() => clearInterval(intervalId))
    </script>

4、onErrorCaptured:在捕获了后代组件传递的错误时调用。这个钩子带有三个实参:错误对象、触发该错误的组件实例,以及一个说明错误来源类型的信息字符串,错误可以从以下几个来源中捕获:

  • 组件渲染
  • 事件处理器
  • 生命周期钩子
  • setup() 函数
  • 侦听器
  • 自定义指令钩子
  • 过渡钩子

总结

1、配置式中存在 beforeCreate 和 created 两个钩子,但是在组合式中却没有对应的钩子。这是因为在组合式中,setup 函数会在组件实例初始化的早期阶段执行,并且在这个阶段,propscontext 已经可用。setup 函数的执行时间点大致相当于选项式 API 中的 beforeCreatecreated 之间。因此,setup 本身就可以处理 beforeCreatecreated 钩子中需要执行的逻辑,这使得它们变得不再必要。

2、新增两个可供调试的生命周期钩子:onRenderTracked、onRenderTriggered。这两个事件都带有一个debugger event,该事件会告诉你哪个操作跟踪了组件以及该操作的目标对象和键。

3、对于其他生命周期,组合式和配置式功能一致,只是在命名上存在差异

4、使用方面也存在差异,配置式参考Vue2生命周期使用,组合式则是在 先引入,然后在 setup 中通过函数注册的方式引用。

5、如果同时存在 配置式和组合式两种生命周期,那么会先执行组合式,然后在执行配置式。这是因为 setup 函数是在实例化之前执行的,而配置式生命周期使在new Vue 实例化之后才存在的。所以 setup 函数中的生命周期钩子也会在配置式之前执行

mounted() {
  console.log('配置式 API: mounted');
},
setup() {
  onMounted(() => {
    console.log('组合式 API: onMounted');
  });
},

 

6、Vue2 中生命周期和Vue3 配置式的生命周期大同小异,除了初始化阶段的流程、模板编译的判断、以及卸载阶段的名称之外,其他基本一致

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

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

相关文章

Office办公软件从哪里下载

Offece下载方法有哪些&#xff1f;从哪里下载Office办公软件&#xff1f;是日常办公必不可少的常用软件。 进入正题 第一步&#xff1a;下载最新的office办公软件软件包 https://docs.qq.com/doc/DQUhtSnJxU1FxZnVF 先下载后解压&#xff0c;看到下面的文件 然后右击-以管理…

mq-work模型

work模型是什么-任务模型 会产生什么现象&#xff1f; 操作 1、新建一个队列 2、在consuner增加2个消费者 2、发送50条消息 4、消费者1和消费者2&#xff0c;一轮1次 消费能力不一致&#xff0c;还是一人一个消费50条消息&#xff0c;所以浪费了能力 总结 prefetch预获取&#…

文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(一)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

单片机原理及技术(六)—— 中断系统的工作原理

目录 一、AT89S51中断技术概述 二、AT89S51中断系统结构 2.1 中断请求源 2.2 中断请求标志寄存器 2.2.1 TCON 寄存器 2.2.2 SCON 寄存器 三、中断允许与中断优先级的控制 3.1 中断允许寄存器 IE 3.2 中断优先级寄存器 IP 四、响应中断请求的条件 五、外部中断的触发…

KubeSphere核心实战_kubesphere部署redis02_创建redis现指定存储卷_配置外网访问服务---分布式云原生部署架构搭建048

然后我们再去看一下服务,这里,这里就是刚刚我们创建 redis工作负载的时候,给咱们自动生成了一个服务,可以看到这个服务, his-redis-后面有乱码是自动生成的,如果我们想弄一个有意义的,好看的,可以删除了自己创建 比如我们删除掉自动生成的服务,注意不要删除工作负载 点击确定…

文书智能助手

背景 司法、医疗等行业存在着大量的文书&#xff0c;一份文书或者卷宗少则几十页&#xff0c;多则几万页。在查看和检查这些文书时&#xff0c;会遇到大量的信息。当需要查询进一步的详细内容时&#xff0c;往往需要选择一下文字&#xff0c;然后再在各种系统中 查询详细的信息…

ES与MySQL数据同步实现方式

1.什么是数据同步: 1.Elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;Elasticsearch也必须跟着改变&#xff0c;这个就是Elasticsearch与mysql之间的数据同步 2.数据同步实现方式&#xff1a; 常见的数据同步方案有三种&#x…

2020 位示图

假设某计算机的字长为32位&#xff0c;该计算机文件管理系统磁盘空间管理采用位示图&#xff08;bitmap&#xff09;&#xff0c;记录磁盘的使用情况。若磁盘的容量为300GB&#xff0c;物理块的大小为4MB&#xff0c;那 么位示图的大小为&#xff08; &#xff09;个字。 要计…

【SQL】仅出现一次的最大数据

目录 题目 分析 代码 题目 MyNumbers 表&#xff1a; ------------------- | Column Name | Type | ------------------- | num | int | ------------------- 该表可能包含重复项&#xff08;换句话说&#xff0c;在SQL中&#xff0c;该表没有主键&#xff09;。…

一个轻量级的数据库条件检索引擎,专门设计来简化后端查询逻辑的开发,专注高级查询的只读 ORM 工具(附源码)

前言 在软件开发过程中&#xff0c;后端开发者经常面临着复杂多变的数据库查询需求。产品经理和项目经理可能会频繁地提出新的查询条件&#xff0c;要求支持各种模糊查询、直接查询&#xff0c;甚至需要在用户界面上提供下拉列表等元素&#xff0c;以增强用户体验。 然而&…

进阶SpringBoot之 Druid 数据源

Druid 是开源平台上一个数据库连接池实现&#xff0c;具备日志监控功能 Druid 可以很好的监控 DB 连接池和 SQL 的执行情况&#xff0c;天生就是针对监控而生的 DB 连接池 Maven 仓库 pom.xml 文件导入 Durid 的 jar 包 <!-- Druid依赖 --><dependency><grou…

前端视角解决chrome/firefox浏览器访问国家税务局发票查验平台验证码获取提示”网络异常,请稍后再试“解决方法

目录 问题描述问题原因解决办法 问题描述 chrome等浏览器访问国家税务局发票查验平台时获取验证码提示”网络异常&#xff0c;请稍后再试“&#xff0c;安装根证书、信任根证书也无效 问题原因 使用开发者工具查看执行过程&#xff0c;点击获取验证码后ajax请求地方税务局的…

嵌入式AI快速入门课程-K510篇 (一)

嵌入式AI快速入门课程-K510篇 手册属性 属性描述类别嵌入式AI开发文档名嵌入式AI快速入门手册-K510篇当前版本1.0适用型号DongshanPI-Vision编辑百问科技文档编辑团队审核韦东山 更新记录 更新日期更新内容更新版本2023/11/09文档大纲编写完毕V1.0 文章目录 嵌入式AI快速入门课…

如何培养单元测试的习惯?怎样才算一个好的单元测试?

你是怎么编写单元测试的呢&#xff1f;很多人的做法是先把所有的功能代码都写完&#xff0c;然后&#xff0c;再针对写好的代码一点一点地补写测试。 在这种编写测试的做法中&#xff0c;单元测试扮演着非常不受人待见的角色。你的整个功能代码都写完了&#xff0c;再去写测试…

C语言:顺序表的实现和通迅录项目实现

顺序表 1、顺序表的概念及结构 1.1 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构&#xff0c;常⻅的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&…

openstack基本操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

python语言day9 正则表达式 和 xpath 解析html

正则表达式&#xff1a; 正则表达式的语法&#xff1a; 元字符&#xff1a; \D \d \w \W . [ ] 量词&#xff1a; ? * 惰性匹配&#xff1a; 玩儿(?P<name>.*?)游戏&#xff1a; 匹配到第一个游戏结束&#xff0c;name 匹配的文本。 玩儿(?P<na…

分享cesium的风场开源网站

首先是有在二维地图上的一个风场效果&#xff0c;通过canvas进行的绘制&#xff0c;例如leaflet开源地图上就能够根据数据生成风场的效果图。 最近mapbox里的大神分享了如何在cesium上实现风场的效果&#xff0c;并在github上进行了开源&#xff0c;开源地址: https://github.…

SSL Pining 问题解决方案

实战案例 为了能够更好的复现 SSL Pining 场景&#xff0c;我们对一个 App&#xff08;https:app4.scrape.center&#xff09;进行抓包&#xff0c;这个 App 包含了 SSL Pining 的相关设置&#xff0c;如果我们将手机的代理设置为抓包软件提供的代理服务&#xff0c;那么这个 …

Windows 11上RTX 4090深度学习与大模型微调环境安装指南

【本文原作者&#xff1a;擎创科技资深产品专家 布博士】 在安装深度学习及大模型微调环境时&#xff0c;经历了多次反复操作&#xff08;如CUDA、cuDNN、PyTorch的安装与卸载&#xff09;。为了避免走弯路&#xff0c;总结了以下步骤&#xff1a; 步骤 1&#xff1a;显卡驱动…