前端入门(五)Vue3组合式API特性

news2025/2/28 16:39:38

文章目录

  • Vue3简介
    • 创建Vue3工程
      • 使用vite创建
      • vue-cli方式
  • 常用 Composition API
    • 启动项 - setup()
      • setup的执行时机与参数
    • 响应式原理
      • vue2中的响应式
      • vue3中的响应式
      • ref函数
      • reactive函数
      • reactive与ref对比
    • 计算属性 - computed
    • 监视属性 - watch
      • watchEffect
    • Vue3生命周期
    • 自定义hook函数
    • toRef
  • 其他Composition API
    • shallowReactive()与shallowRef()
    • readonly() 与shallowReadonly()
    • toRaw与markRaw
    • customRef
    • provide与inject
    • 对响应式的数据进行判断
  • 新的组件与其他变化
    • Fragment(片段)
    • Teleport(传送)
    • Suspense(悬浮)
    • 其他变化
      • 全局API的转移
      • 其他改动

Vue3简介

Vue3带来了:

  • 1、性能的提升:
    • 打包大小减少41%
    • 初次渲染快55%, 更新渲染快133%
    • 内存减少54%
    • ……
  • 2、源码的升级
    • 使用Proxy代替defineProperty实现响应式
    • 重写虚拟DOM的实现和Tree-Shaking
  • 3、拥抱TypeScript
  • 4、新的特性
      1. Composition API(组合API) (用前要引入)
        ○ setup配置
        ○ ref与reactive
        ○ watch与watchEffect
        ○ provide与inject
        ○ …
      1. 新的内置组件
        ○ Fragment
        ○ Teleport
        ○ Suspense
      1. 其他改变
        ○ 新的生命周期钩子
        ○ data 选项应始终被声明为一个函数
        ○ 移除keyCode支持作为 v-on 的修饰符
        ○ …

创建Vue3工程

使用vite创建

官方文档:https://v3.cn.vuejs.org/guide/installation.html#vite

vite官网:https://vitejs.cn

  • 什么是vite?—— 新一代前端构建工具。
  • 优势如下:
    • 开发环境中,无需打包操作,可快速的冷启动。
    • 轻量快速的热重载(HMR)。
    • 真正的按需编译,不再等待整个应用编译完成。
  • 传统构建 与 vite构建对比图

在这里插入图片描述
在这里插入图片描述

vue-cli方式

VUE3官方文档

## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version
## 安装或者升级你的@vue/cli
npm install -g @vue/cli
## 创建
vue create vue_test
## 启动
cd vue_test
npm run serve

在这里插入图片描述

常用 Composition API

启动项 - setup()

setup是所有Composition AIP(组合API)“表演的舞台”。

  • 1、组件中所用到的:数据、方法等均要配置在setup中,不需要专门的datamethods等配置项了。
  • 2、setup函数的两种返回值:
    • 若返回一个对象,则对象中的属性、方法在模板中均可以直接使用。
    • 若返回一个渲染函数:则可以自定义渲染内容。(了解)

在这里插入图片描述
在这里插入图片描述

setup的执行时机与参数

setup()执行的时机是先于beforecreated的,此时vue实例尚未创建,因此setup()函数内部thisundefined

setup()可以接收两个参数:

  • props:值为一个对象,包含了组件外部传递过来,且在组件内部声明接收了的属性项。
  • context:上下文对象,主要包含下边3个属性:
    • attrs:值为对象,包含组件外部传递过来,且在本组件中props配置中没有声明的属性,该对象也存在于this.$attrs
    • slots:收到的插槽内容,相当于 this.$slots
    • emits:分发自定义事件的函数,相当于this.$emit

响应式原理

vue2中的响应式

在vue2中,通过Object.defineProperty()对对象属性的读取、修改进行了拦截(数据劫持)。对数组类型,通过重写数组更新的一系列方法实现拦截,对其变更方法进行了包裹。

这种响应式实现存在以下问题:

  • 新增属性、删除属性,界面不会更新
  • 直接通过下标修改数组,界面不会自动更新。

vue3中的响应式

  • 1、通过Proxy(代理):拦截对象中任意属性的变化,包含属性值的读写、属性的添加、属性的增删
  • 2、通过Reflect(反射):对被代理对象的属性进行操作

ref函数

在setup中安置的数据项并不会直接被vue监测,如果想要使其被vue监测,实现响应式的更新,应该使用ref函数,其作用是定义一个响应式的数据的引用对象(reference object)

使用ref函数构建的数据项类型是一个RefImpl引用实现类型,对RefImpl对象的value属性更新,对于Vue框架是可见的,但在模板中使用其时,不必加value属性,Vue框架会自动解析到其中的value。
在这里插入图片描述
ref函数的参数也可以是一个对象,如果是对象,其value属性是一个Proxy对象,拥有原对象的每一个属性,对其的修改也是响应式的。
在这里插入图片描述

reactive函数

reactive函数的作用是定义一个对象(数组)类型的响应式数据,基本类型用refreactive只能处理对象类型的数据。

语法:const 代理对象 = reactive(源对象)接收一个对象或数组,返回其代理对象(Proxy实例)

reactive定义的响应式数据是深层次的,即对其多层数据的更改同样是响应式。

在这里插入图片描述

reactive与ref对比

1、从定义数据角度:

  • ref用于定义基本数据类型
  • reactive用来定义:对象或者数组类型
  • ref也可以用来定义对象(数组)类型数据,它内部会自动通过reactive转为代理对象。
    2、从原理角度:
  • ref通过Object.defineProperty()的get与set实现响应式(数据劫持)
  • reactive通过使用Proxy实现响应式,并通过Reflect操作源对象内部的数据。

3、从使用角度:

  • ref定义的数据,操作数据需要.value,模板使用不需要.value
  • reactive定义的数据:操作数据与模板使用均不需要.value

计算属性 - computed

Vue3中的computed不再是内置选项,需要import导入,随后在setup()中配置,配置方式与Vue2中基本一致。
在这里插入图片描述

监视属性 - watch

watch属性在Vue3的组合式API中,也不再是内置属性,在需要使用时进行import。

监视属性,当监视对象分为refreactive时,有下边几种不同的情况。

1、当监视ref定义的响应式数据
在这里插入图片描述
watch函数还有第三个选填参数,配置一个对象,设置immediate、deep是否为true。

在这里插入图片描述

2、监视ref定义的多个响应式数据
可以写多个watch函数,当然也可以写为数组形式,当写为数组形式监视多个数据时,handle回调中 newValue、oldValue也是一个数组,根据下标判断,是哪个具体的数据。
在这里插入图片描述
3、监视reactive定义的一个响应式数据
注意:这种虽然可以触发监视逻辑,但是无法获取正确的odlvalue,console结果中old和new的值都是新的值
在这里插入图片描述
对于reactive定义的响应式数据,进行监视,是强制开启深度监视的,即便你配置deep为false也是无效,这与reactive的实现方式有关。

4、监视reactive定义的响应式对象的某个属性。
注意:此时的监视对象需要写为函数类型,因为假如你直接使用person.name,它其实是一个普通类型的值,没有响应式效果。
在这里插入图片描述

5、监视reactive定义的响应式属性的多个属性。
数组中每个元素都得写为函数类型。
在这里插入图片描述

总结:
一般在生产情况中,使用reactive,但此时oldValue会失效,如果要解决这个问题,可以将其单独拎出来,使用ref

watchEffect

  • watchEffect,不需要证明具体监视哪个属性,因此写起来更加高效,即effect。
  • watchEffect有点像computed,监视回调中用到哪个属性,就监视哪个属性,但computed注重计算出来的值(回调函数返回值),所以必须写返回值。而wacthEffect更加注重过程,回调函数的函数体,所以不用写返回值。

在这里插入图片描述

Vue3生命周期

1、Vue3中可以继续使用Vue2中生命周期的钩子,但有两个被改名了:

  • beforeDestroy改名为beforeUnmount
  • destroyed改名为unmounted

2、Vue3中也提供了组合式API形式的生命周期钩子,与Vue2中的钩子对应关系如下:

注意:前两个函数,beforeCreate与Create 相当于Vue3中的setup阶段
在这里插入图片描述

自定义hook函数

这里的hook本质上是一个函数,目的是将setup中可以复用的组合式API进行一个封装,类似于Vue2中mixin。

自定义hook的优势也与mixin一样,复用代码,使得setup中写的逻辑更加清晰易懂。

step1:定义hook文件夹,实现定义hook逻辑的js文件
在这里插入图片描述
step2:引入并在setup中直接使用。
在这里插入图片描述

toRef

  • 作用:创建一个ref对象,使其value属性指向另一个对象的某个属性,假如我们要将响应式对象中某个属性单独提供给外部使用时,可以使用ref。
  • 语法:const name = toRef(person, 'name')
  • 扩展:toRefs,批量创建,不再需要第二个参数,会将对象的每一个属性批量创建为同名的RefImpl。

在这里插入图片描述
使用toRef建立引用绑定关系后,在template中就可以直接使用这些属性,且不会丢失响应式特性:
在这里插入图片描述
使用toRefs结合...语法:
在这里插入图片描述

其他Composition API

shallowReactive()与shallowRef()

shallow是浅层次的意思。

  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。
  • 什么时候用?
    • 如果有一个对象数据,结构比较深,只希望最外层属性响应式变化,使用shallowReactive
    • 如果有一个对象数据,后续功能不会修改对象中的属性,而是生成新的对象替换,使用shallowRef

readonly() 与shallowReadonly()

  • readonly:让一个响应式数据变为只读(深只读)
  • shallowReadonly:让一个响应式数据变为只读(浅只读)
  • 应用场景:不希望数据被修改

toRaw与markRaw

  • toRaw:将一个reactive生成的响应式对象,转为普通对象
  • markRaw:标记一个对象,使其永远不会再成为响应式对象

customRef

作用:创建一个自定义的ref,并对其依赖跟踪和更新触发进行显示控制。

provide与inject

实现祖孙组件间(至少隔一代)的通信(实际上父子间也可以,只不过父子间一般使用props通信)

在这里插入图片描述
step1:祖组件中provice
在这里插入图片描述
step2:后代组件inject:

在这里插入图片描述

对响应式的数据进行判断

  • isRef:检查一个值是否为一个ref对象
  • isReactive:检查一个对象是否是由reactive创建的响应式代理
  • isReadonly:检查一个对象是否是由readonly创建的只读代理
  • isProxy:检查一个对象是否是由reactive或者readonly创建的代理。

新的组件与其他变化

Fragment(片段)

  • 在Vue2中:组件必须有一个根标签div
  • 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个Fragment的虚拟元素中
  • 这样的好处在于减少标签层级,减小内存占用

Teleport(传送)

teleport是一种能够将我们的组件的HTML结构移动到指定位置的技术。
在这里插入图片描述

Suspense(悬浮)

等待异步组件时,渲染一些额外的组件,优化用户体验

其他变化

全局API的转移

Vue2中有很多全局的API和配置,借助的Vue.xxx实现,而在Vue3中取消了Vue这个实例,转而使用app替代,很多Vue原有的API转移到了app实例上。

在这里插入图片描述

  • 配置:config
  • 全局组件:component
  • 全局指令:directive
  • 全局混入:mixin
  • 引入插件:use
  • 给原型配置属性:prototype

其他改动

  • 1、data应该始终写为函数返回值。
  • 2、移除keyCode作为v-on的修饰符(@keyup.13,非法)
  • 3、移除v-on.native修饰符。

vue2中默认给组件绑定事件为自定义事件,如果是内置事件,需要使用native声明,而在vue3中,当父组件给子组件绑定事件时,子组件在使用emits触发事件时,如果有相应配置,则是自定义事件,如果没有配置,则会被识别为内置事件。
在这里插入图片描述

  • 4、移除了过滤器(filter),推荐使用计算属性或者方法调用实现。

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

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

相关文章

滑动平均窗口的定义,优点,缺点,以及目前的应用!!

文章目录 前言一、滑动平均窗口的优点二、滑动平均窗口的缺点三、滑动平均窗口的应用 前言 滑动平均窗口是一种数据处理方法,它以固定的窗口大小对数据进行移动,并在每个窗口内计算数据的平均值。这种方法主要用于平滑数据,减小数据波动的影…

基于SpringBoot的仓库管理系统设计与实现附带源码和论文

博主24h在线,想要源码文档部署视频直接私聊,全网最低价,9.9拿走! 【关键词】仓库管理系统,jsp编程技术,mysql数据库,SSM,Springboot 目 录 摘 要 Abstract 第1章 绪论 1.1 课题…

阿里云服务器跨区域迁移(多数据盘)

方法一. 复制镜像,共享镜像(只有系统盘没有数据盘的情况!) 正常阿里云同区域服务器迁移只需要选择共享镜像即可,但是由于新老服务器区域限制所以需要先复制到新服务器区域再进行共享 选择服务器实例先创建后复制 比如…

Linux 内核源码各版本下载

下载地址: kernel/git/stable/linux.git - Linux kernel stable treehttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/ 1. Linux 内核的基本概念: 内核是什么? 内核是操作系统的核心部分,负责管理系统…

网络虚拟化场景下网络包的发送过程

网络虚拟化有和存储虚拟化类似的地方,例如,它们都是基于 virtio 的,因而在看网络虚拟化的过程中,会看到和存储虚拟化很像的数据结构和原理。但是,网络虚拟化也有自己的特殊性。例如,存储虚拟化是将宿主机上…

物流单管理系统软件物流单打印,物流单打印模板,佳易王物流快运单管理软件下载

物流单管理系统软件物流单打印,物流单打印模板,佳易王物流快运单管理软件下载 软件试用版下载或技术支持可以点击最下方官网卡片 上图:在物流开单时,可以先输入电话,如果之前存在该托运人信息,则可以一键…

hbase Master is initializing

问题如下: ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializingat org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)at org.…

P1 什么是链表 C语言简单易懂

目录 前言 01 什么是链表 02 数组的特点 03 数组的缺点 3.1 删除数组其中一个元素 3.2 数组增加某个节点 04 链表 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《 C 》✨✨✨ 🔥 推荐专栏2: 《 Linux C应用编程(概念…

Web自动化测试详解

做测试的同学们都了解,做Web自动化,我们主要用Selenium或者是QTP。 有的人可能就会说,我没这个Java基础,没有Selenium基础,能行吗?测试虽然属于计算机行业,但其实并不需要太深入的编程知识&…

神经网络 代价函数

神经网络 代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m m m个,每个包含一组输入 x x x和一组输出信号 y y y, L L L表示神经网络层数, S I S_I SI​表示每层的neuron个数( S l S_l Sl​表示输出…

论文编写软件latex安装教程

目录 1.下载安装包2.安装texlive 本人系统为windows,本教程基于windows系统,如果是其它系统请参考对应教程,注意选择对应系统的安装包! 1.下载安装包 有三种集成环境安装包 texlive 是主流的环境,集成了较多的包&…

百度飞桨(张江)人工智能产业赋能中心入驻申请

中心如何赋能 百度飞桨(张江)人工智能产业赋能中心是浦东“大企业开放创新中心计划”首批企业代表,百度和张江集团将联合为入驻初创企业及生态合作伙伴提供以下服务: 降低AI使用门槛 通过“百度飞桨人工智能公共技术平台”&#x…

基于SpringBoot的企业客户管理系统的设计与实现

摘 要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述企业客户管理系统的当前背景以及系统开发的目…

二维粒子群算法航线规划

GitHub - gabrielegilardi/PathPlanning: Implementation of particle swarm optimization (PSO) for path planning when the environment is known.

亚马逊云科技推出新一代自研芯片

北京——2023 年12月1日 亚马逊云科技在2023 re:Invent全球大会上宣布其自研芯片家族的两个系列推出新一代,包括Amazon Graviton4和Amazon Trainium2,为机器学习(ML)训练和生成式人工智能(AI)应用等广泛的工…

Web前端 ---- 【Vue】(组件)父子组件之间的通信一文带你了解

目录 前言 父组件传子组件 ---- props 给要传递数据的子组件绑定要传过去的属性及属性值 在子组件中使用props配置项接收 props配置项 子组件传父组件 ---- 组件的自定义事件 子组件向父组件传递数据 通过代码来绑定自定义事件 前言 本文将介绍在Vue中父子组件如何进行…

最小生成树(Minimum Spanning Tree)及生成MST的几种方法

最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树&#xf…

各类声音数据集大合集—乐器、车辆、鸟鸣、蜜蜂声音、歌曲、喇叭、人类声音不同等类型的声音数据集

最近收集了一大波关于各类声音的数据集,包含乐器、车辆、鸟鸣、蜜蜂声音、歌曲、喇叭、人类声音不同等类型的声音数据集,废话不多说,给大家逐一介绍!! 1、吉他和弦大调、小调数据集 吉他和弦大调、小调数据集&#x…

中国湖泊面积-水位长时序数据产品(2000-2020)

今天我们分享中国湖泊面积-水位长时序数据产品(2000-2020) 该数据集包含中国典型湖泊2000-2020年最大水体面积、多年平均面积、水位变化速率及空间分布矢量。 数据溯源信息 「数据来源描述」Landsat、HJ、ZY、Jason、ENVISAT、Cryosat、ICESat和HY 「数…

renpy-renpy对话内容汉化

文章目录 前言思路实现1,提取对话内容2,汉化对话内容文件3,修改gui文件,使得renpy游戏支持中文显示 前言 最近下载了一些renpy视觉小说内容,发现对话都为英文,因此我在想能否提取出这些对话然后汉化后再封装回原文件,将其汉化 当然汉化过程是机器翻译,汉化其他语言同理,大概5分…