Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同

Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同?

Composition API 解决了什么问题

Composition API 可以说是 Vue3 的最大特点,那么为什么要推出 Composition Api ,解决了什么问题?

通常使用 Vue2 开发的项目,普遍会存在以下问题:

  • 代码的可读性随着组件变大而变差
  • 每一种代码复用的方式,都存在缺点
  • TypeScript支持有限

以上通过使用 Composition Api 都能迎刃而解

Options Api 选项式API

Options API ,即大家常说的选项API,即以 vue 为后缀的文件,通过定义 methods , computed , watch , data 等属性与方法,共同处理页面逻辑

如下代码:

export default {name: '',props: {},components: { },computed: { },data() {return {}},created() {},methods: {},watch: {}
}

可以看到 Options 代码编写方式,如果是组件状态,则写在 data 属性上,如果是方法,则写在 methods 属性上…

用组件的选项( data 、 computed 、 methods 、 watch ) 组织逻辑在大多数情况下都有效,然而,当组件变得复杂,导致对应属性的列表也会增长,这可能会导致组件难以阅读和理解。

Composition Api 组合式API

在 Vue3 Composition API 中,组件是根据逻辑功能来组织的,一个功能所定义的所有 API 会放在一起(更加的高内聚,低耦合)

即使项目很大,功能很多,我们都能快速的定位到这个功能所用到的所有 API

两者对比

下面对 Composition Api 与 Options Api 进行两大方面的比较

  • 逻辑组织
  • 逻辑复用

逻辑组织

  • Options API

假设一个组件是一个大型组件,其内部有很多处理逻辑关注点。

可以看到,这种碎片化使得理解和维护复杂组件变得困难。

选项的分离掩盖了潜在的逻辑问题。此外,在处理单个逻辑关注点时,必须不断地”跳转"相关代码的选项块。

  • Compostion 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}},
});

可以很直观地感受到 Composition API 在逻辑组织方面的优势,以后修改一个属性功能的时候,只需要跳到控制该属性的方法中即可。

逻辑复用

在 Vue2 中,我们是用 mixin 去复用相同的逻辑,下面举个例子,我们会另起一个 mixin.js 文件

export const MoveMixin = {data() {return {x: 0,y: 0,};},methods: {handleKeyup(e) {console.log(e.code);//上下左右 x yswitch (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 yswitch (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 API 对 tree-shaking 友好,代码也更容易压缩
  • Composition API 中见不到 this 的使用,减少了 this 指向不明的情况
  • 如果是小型组件,可以继续使用 Options API ,也是十分友好的

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

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

相关文章

Java 将base64编码字符串转换为图片工具类

前言 在一些前后端分离项目中&#xff0c;接口方需要前端把图片转换成base64编码字符串&#xff0c;和表单信息一起通过json接口提交。故在后端中&#xff0c;需要对前端传过来的bas64编码字符串转换成图片文件进行存储。 代码 import lombok.extern.slf4j.Slf4j;import jav…

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…

【面试高频算法解析】算法练习1 二分查找

目录 前言算法解析练习题二分查找在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组 前言 本篇章开放目的是按算法类型学习算法&#xff0c;学习对应算法理论&#xff0c;并通过练习一些经典算法题深入理解这类算法&#xff0c;避免出现刷了很多算法题&#xff0c;…

golang学习专栏

GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…

11.Kubernetes Ingress NGINX Controller 部署

Ingresss是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。 Ingress NGINX Controller 是kubernetes官方维护的 Ingress 控制器 至此、kubernetes必要的组件都已经安装完成,后面可以演示一…

Java 读取超大excel文件

注意&#xff1a;此参考解决方案只是针对xlsx格式的excel文件&#xff01; Maven <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version> </dependency>读取方式1…

xxl.job docker 命令部署

xxl.job docker 命令部署 docker run -e \ PARAMS"--xxl.job.accessTokentoken123456 \ --server.servlet.context-path/xxjob-path \ --spring.datasource.usernamexxl_job \ --spring.datasource.passwordmysqlpwd \ --spring.datasource.urljdbc:mysql://192.168.121.…

安装elasticsearch、kibana、IK分词器、扩展IK词典

安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana&#xff0c;这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样&#xff01;&#xff01;&#xff01; 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…

java常用数据结构

List&#xff1a;ArrayList 和 LinkedList 1、ArrayList 和 LinkedList都是非线程安全 2、ArrayList 可以直接根据下表定位元素&#xff0c;查找速度快&#xff0c;但是修改元素慢&#xff1b;LinkedList 查找元素必须从第一个开始逐个查找&#xff0c;查找速度慢&#xf…

力扣labuladong一刷day51天单调栈应用

力扣labuladong一刷day51天单调栈应用 一、239. 滑动窗口最大值 题目链接&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/ 思路&#xff1a;滑动窗口最大值&#xff0c;既要维护加入的时间顺序&#xff0c;又要 class Solution {public int[] maxSliding…

QT上位机开发(会员管理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了ini文件的解析办法&#xff0c;通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外&#xff0c;另外一种经常出…

pip安装报错SSL

confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索&#xff1a;ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…

第6章-第2节-Java中的String类

1、字符串体系&#xff1a;又被称为不可变的字符序列 理解&#xff1a;描述生活中的一句话&#xff0c;内容可长可短&#xff0c;长到没有上限要求&#xff0c;短到可以没有内容 类型&#xff1a;java.lang.String类 特点&#xff1a; 1&#xff09;、不可以被别的类继承…

GC6150 5V低压步进电机驱动芯片,低噪声、低振动 应用于摄像机,机器人 医疗器械等产品中。

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…

【SpringBoot3】命令行运行jar包报错可能的一些原因

端口号冲突&#xff1a; 有其他的web程序在运行&#xff0c;占用了8080端口没有主清单属性&#xff1a; 在打包jar包前&#xff0c;没有加入打包的插件spring-boot-maven-plugin&#xff0c;参考1.SpringBoot入门的第一个完整小项目&#xff08;新手保姆版教会打包&#xff09;…

【EI会议征稿通知】第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024)

第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024&#xff09; 2024 5th International Conference on Electrical, Electronic Information and Communication Engineering (EEICE 2024) 第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024&#xff09;将于20…

docker安装esrally教程

本来用源码安装&#xff0c;首先要安装git,python,jdk&#xff0c;还要配环境特别繁琐&#xff0c;好不容易安装好后运行报如下错误&#xff0c;在官网和github搜不到解决方案&#xff0c;无奈之下只能用docker安装。 [ERROR] Cannot race. Error in load generator [0]Cannot…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁&#xff0c;其中关键组件Redis是重灾区&#xff0c;本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备&#xff0c;但是由于Redis内部的主从实现对机房间的网络延迟等…

基于ssm的剧本杀预约系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于剧本杀预…

el-table表格动态添加列。多组数据拼接和多层级数据的处理

提示&#xff1a;el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中&#xff0c;为避免闪屏&#xff0c;可以表格数据统一渲染总结 前言 需求&#xff1a;富文本编辑器 一、多组数据拼接 <template><div class"test">…