Vue3使用的Compostion Api和Vue2使用的Options Api有什么不同?

news2025/2/6 7:55:56

我们介绍Compostion Api和Options Api的区别之前,先来说一下为什么会推出来Composition
Api,解决了什么问题?

Vue2开发项目使用Options Api存在的问题

  • 代码的可读性和维护性随着组件的变大业务的增多而变得差
  • 代码的共享和重用性存在缺点
  • 不支持TS语法

上面存在的问题我们使用Compostion Api都可以完美的解决掉

一、Options Api

1、设计的出发点:

  • 包含一个描述组件选项 ( data, methods, props 等) 的对象
  • Options APi 开发复杂组件,同一个功能逻辑的代码被拆分到不同选项

2、示例如下:
在这里插入图片描述
在这里插入图片描述

可以看到 Options 代码编写方式,如果是组件状态,则写在 data 属性上,如果是
方法,则写在 methods 属性上…
用组件的选项 (data、computed、methods、watch) 组织逻辑在大多数情况下都有

然而,当组件变得复杂导致对应属性的列表也会增长,这可能会导致组件难以阅
读和理解

二、Compostion Api (组合式API)

1、设计的出发点:

  • Vue.js 3.0 新增的一组 API
  • 一组基于函数的 API
  • 可以更灵活的组织组件的逻辑

2、示例如下:

在这里插入图片描述
在这里插入图片描述
在 Vue3 Composition API 中,组件根据逻辑功能来组织的,一个功能所定义的所
有 API 会放在一起(更加的高内聚,低耦合
即使项目很大,功能很多,我们都能快速的定位到这个功能所用到的所有 API

三、二者的区别对比

我们可以从两个方面进行区别对比:

  • 逻辑组织
  • 逻辑复用

1- 逻辑组织
假设一个组件是一个大型组件,其内部有很多处理逻辑

我们使用Options Api时候,可以看到,这种碎片化使得理解和维护复杂组件变得困难
选项的分离掩盖了潜在的逻辑问题。此外,在处理单个逻辑关注点时,我们必须不
断地“跳转”相关代码的选项块
在这里插入图片描述
而 Compositon API 正是解决上述问题,将某个逻辑关注点相关的代码全都放在一
个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去
在这里插入图片描述
下面举个简单例子,将处理 count 属性相关的代码放在同一个函数了

function useCount() {
 let count = ref(10);
 let double = computed(() => {
 return count.value * 2;
 });
 const handleConut = () => {
 count.value = count.value * 2;
 };
 console.log(count);
 return {
 count,
 double,
 handleConut,
 };
}
// 组件上中使用 count
export default defineComponent({
 setup() {
 const { count, double, handleConut } = useCount();
 return {
 count,
 double,
 handleConut
 }
 },
});

二者的Demo具体对比如下:
在这里插入图片描述
1- 逻辑复用
处理复杂多个组件没关联时候,我们在vue2里面有用过mixin去复用相同的逻辑
示例如下:

在vue2我们会另起一个 mixin.js 文件

export const MoveMixin = {
 data() {
	 return {
	 x: 0,
	 y: 0,
	 };
 },
 methods: {
	 handleKeyup(e) {
		 console.log(e.code);
		 // 上下左右 x y
		 switch (e.code) {
		 case "ArrowUp":
		 this.y--;
		 break;
		 case "ArrowDown":
		 this.y++;
		 break;
		 case "ArrowLeft":
		 this.x--;
		 break;
		 case "ArrowRight":
		 this.x++;
		 break;
 	}
 },
 },
 mounted() {
 	window.addEventListener("keyup", this.handleKeyup);
 },
 unmounted() {
 	window.removeEventListener("keyup", this.handleKeyup);
 },
};

然后在组件中使用

<template>
 <div>
 Mouse position: x {{ x }} / y {{ y }}
 </div>
</template>
<script>
import mousePositionMixin from './mouse'
export default {
 mixins: [mousePositionMixin]
}
</script>

使用单个 mixin 似乎问题不大,但是当我们一个组件混入大量不同的 mixins 的时

mixins: [mousePositionMixin, fooMixin, barMixin, otherMixin]
会存在两个非常明显的问题:

  • 命名冲突
  • 数据来源不清晰

现在通过 Compositon API 这种方式改写上面的代码

import { onMounted, onUnmounted, reactive } from "vue";
export function useMove() {
 const position = reactive({
 x: 0,
 y: 0,
 });
 const handleKeyup = (e) => {
 console.log(e.code);
 // 上下左右 x y
 switch (e.code) {
 case "ArrowUp":
 // y.value--;
 position.y--;
 break;
 case "ArrowDown":
 // y.value++;
 position.y++;
 break;
 case "ArrowLeft":
 // x.value--;
 position.x--;
 break;
 case "ArrowRight":
 // x.value++;
 position.x++;
 break;
 }
 };
 onMounted(() => {
 window.addEventListener("keyup", handleKeyup);
 });
 onUnmounted(() => {
 window.removeEventListener("keyup", handleKeyup);
 });
 return { position };
}

在组件中使用

<template>
 <div>
 Mouse position: x {{ x }} / y {{ y }}
 </div>
</template>
<script>
import { useMove } from "./useMove";
import { toRefs } from "vue";
export default {
 setup() {
 const { position } = useMove();
 const { x, y } = toRefs(position);
 return {
 x,
 y,
 };
 },
};
</script>

可以看到,整个数据来源清晰了,即使去编写更多的 hook 函数,也不会出现命名
冲突的问题

总结

  • 逻辑组织和逻辑复用方面Composition API 是优于 Options API 因为 Composition API 几乎是函数,会有更好的类型推断。
  • Composition APItree-shaking 友好,代码也更容易压缩
  • Composition API 中见不到 this 的使用,减少了 this 指向不明的情况
  • 如果是小型组件,可以继续使用 Options API,也是十分友好

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

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

相关文章

Halcon颜色提取,基于MLP自动颜色提取功能

1.前言 在实际的图像处理中&#xff0c;经常会遇到彩色图像&#xff0c;使用彩色图像往往跟颜色识别有关系。但是使用RGB进行调参时又很难达到所需要的效果&#xff08;异常区域过多不好处理&#xff09;。 在Halcon中&#xff0c;halcon对颜色提取采用MLP&#xff08;多层感知…

swagger1.2 apiPost工具测试接口没有问题,换成swagger 接口调测时报错 Required request body is missing

把 请求方法由get换成post GetMapping换成 PostMapping 原因apiPost自动把请求json参数封装到请求体里了&#xff0c; 但swagger没有封装&#xff0c;通过networker可以看到载荷里并没有任何东西

nginx记录配置文件

查询当前域名配置所在的nginx文件路径 1&#xff1a;nginx -t 2&#xff1a;cd /usr/local/nginx/conf (如果没看到conf文件&#xff0c;那就根据不同公司定制的规则&#xff0c;这里是才conf下的vhost/) 3:cat xxx.conf 能看到 包应该要放的位置 4&#xff1a;把包解压到…

W6100-EVB-Pico评估版介绍

文章目录 1 简介2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图&#xff08;尺寸&#xff1a;mm&#xff09;3.4 参考例程 4 硬件协议栈优势 1 简介 W6100-EVB-Pico是一款基于树莓派RP2040和全硬件TCP/IP协议栈以太网芯片W6100的…

Android studio 多界面的跳转和返回

一、新建一个Empty Activity项目&#xff1a; 二、修改activity_main.xml布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/a…

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描&#xff0c;相片矫正这块。 读取图像Cv2.ImRead();预处理&#xff08;灰度化&#xff0c;高斯滤波、边缘检测&#xff09;轮廓检测&#xff08;获取到最大轮廓&#xff09;获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

【数据库优化汇总】使用这8招后,数据库查询从191s优化到30ms!

为什么数据库会慢&#xff1f; 慢的本质 查找的时间复杂度 查找算法 存储数据结构 存储数据结构 数据总量 数据拆分 高负载 CPU、磁盘繁忙 无论是关系型数据库还是NoSQL&#xff0c;任何存储系统决定于其查询性能的主要有三种&#xff1a; 查找的时间复杂度数据…

越南语翻译中文有什么特点,怎样翻译比较好?

近年来&#xff0c;随着中越经济贸易的日益频繁&#xff0c;语言交流已无法避免&#xff0c;越南语翻译的需求也持续增加。那么&#xff0c;越南语有何独特之处&#xff1f;越南语翻译成中文时&#xff0c;又该如何处理呢&#xff1f; 专业人士指出&#xff0c;在进行越南语翻译…

cefsharp120.1.110(cef120.1.10,Chromium120.0.6099.129)升级测试及其他H264版本

一、版本变化 v120.1.80–>v120.1.110 相对于120.1.80 更新了一个安全更新,针对Google 获悉存在针对 CVE-2023-7024 的漏洞。 说明:本版本暂时不支持264,其他H264版本参考119,116,115,114,111,110,109,107,100等版本 v109是支持win7/8/8.1最后一个版本(推荐v100版本) v…

鸿蒙4升级进展:共137款产品加入升级,Mate 20也能升级了

从华为官方发布的鸿蒙升级进展来看&#xff0c;2018年发布的Mate 20系列机型也开始了鸿蒙4系统升级的测试招募。 5年之期已到&#xff0c;再战5年不是梦想&#xff1f; 另外&#xff0c;从明年一季度的升级预告来看&#xff0c;春节前后升级的主要为穿戴手表产品。 目前&…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…

YOLOv7训练数据报错

YOLOv7训练数据报错 错误提示1解决方案问题2解决方案成功运行 错误提示1 fatal: not a git repository (or any of the parent directories): .git Traceback (most recent call last):File "/home/ubuntu/code/yolov7-main/utils/google_utils.py", line 26, in att…

为什么说依赖抽象就变得更加灵活呢?举例

说依赖抽象变得更加灵活的主要原因在于它提供了更大的替换和扩展的空间。让我们通过一个简单的例子来说明&#xff1a; 考虑一个电商系统&#xff0c;其中有一个OrderProcessor类负责处理订单&#xff0c;它依赖于一个PaymentGateway用于处理支付。最初的设计可能如下所示&…

前端,build后index报错,noscript

解决方法&#xff1a; npx update-browserslist-dblatest

CSS、JavaScript实现进度条效果HTML

CSS、JavaScript实现进度条效果HTML 效果图 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>ProgressBar</title><style>* {margin: 0;padding: 0;}body {position…

【HTML5】第2章 HTML5标签和属性

学习目标 掌握文本控制标签的用法&#xff0c;能够使用文本控制标签设置文本样式。 掌握图像标签的用法&#xff0c;能够使用图像标签在网页中嵌入图片。 掌握超链接标签的用法&#xff0c;能够使用超链接实现页面的跳转。 掌握列表标签的用法&#xff0c;能够使用列表标签设…

AMEYA360:思瑞浦发布全新并联基准芯片—:TPR43x系列产品

聚焦高性能模拟芯片和嵌入式处理器的半导体公司——思瑞浦(3PEAK, 股票代码&#xff1a;688536)推出全新并联基准芯片TPR433/TPR434。 TPR433/TPR434基于BCD工艺&#xff0c;电压精度0.5%25C&#xff0c;可广泛应用于电源、照明、工业设备等领域。 TPR433/434产品特性 *通过外部…

互联网加竞赛 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

右值引用和移动语义以及C++11新增的类功能

正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 右值引用和左值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特…

移动端防截屏录屏技术在百度账户系统实践

作者 | Seven 导读 在移动端应用的开发过程中&#xff0c;保护用户隐私和应用内敏感信息安全是一个不可忽视的课题。随着诈骗手段的升级&#xff0c;“共享屏幕”被诈骗分子频频使用&#xff0c;因为密码被泄露而导致受害者财物受损的事情层出不穷。只要开启了“共享屏幕”–本…