vue中选项式 API(Options API) 和 组合式 API(Composition API)区别

news2024/10/23 19:37:00

在 Vue 中,选项式 API(Options API)组合式 API(Composition API) 是两种不同的编写组件逻辑的方式。它们的主要区别体现在代码组织、逻辑复用和灵活性上。以下是它们的详细对比:

1. 语法风格

  • 选项式 API

    • 传统 Vue 组件写法,使用一组选项(如 datamethodscomputedwatch 等)来定义组件的状态、逻辑和行为。
    • 每个选项都有自己专门的部分,逻辑上比较直观,但会让相关逻辑散布在不同的选项中。

    示例:

    export default {
      data() {
        return {
          count: 0
        };
      },
      methods: {
        increment() {
          this.count++;
        }
      },
      computed: {
        doubleCount() {
          return this.count * 2;
        }
      }
    }
    

  • 组合式 API

    • 引入自 Vue 3,使用 setup 函数来组合逻辑,允许开发者将与某一功能相关的代码组合在一起,不再受选项划分的限制。
    • 提供更灵活的逻辑组织方式,特别适合复杂应用中的代码复用和模块化。

    示例:

    import { ref, computed } from 'vue';
    
    export default {
      setup() {
        const count = ref(0);
        const increment = () => count.value++;
        const doubleCount = computed(() => count.value * 2);
    
        return { count, increment, doubleCount };
      }
    }
    

2. 代码组织

  • 选项式 API

    • 代码按照功能类型组织:data 定义数据,methods 定义方法,computed 定义计算属性等。
    • 缺点是当组件逻辑复杂时,相关功能的代码可能分散在不同的选项块中,不易于维护。

    **例子:**当一个功能涉及到 datamethods 时,它们分别存在于不同的部分中,阅读或维护时需要在这些部分之间跳转。

  • 组合式 API

    • 代码按照逻辑功能来组织,将相关逻辑(状态、方法、计算属性等)集中在一起,更加模块化。
    • 优点是当组件逻辑复杂时,相关的代码可以紧密组织在一起,易于维护和复用。

3. 逻辑复用

  • 选项式 API

    • 如果需要复用逻辑,通常依赖于 mixinsVue.extend,但 mixins 有命名冲突和逻辑来源不明确的问题。
    • 多个 mixins 可能导致代码变得复杂,不利于清晰的逻辑结构。
  • 组合式 API

    • 提供了 composables(可组合函数)的方式,将逻辑封装成函数,方便在多个组件之间复用。
    • 没有 mixins 的复杂性,逻辑清晰且灵活。

    示例:创建一个可复用的计数逻辑:

    // useCounter.js
    import { ref } from 'vue';
    
    export function useCounter() {
      const count = ref(0);
      const increment = () => count.value++;
      return { count, increment };
    }
    
    // 在组件中使用
    import { useCounter } from './useCounter';
    
    export default {
      setup() {
        const { count, increment } = useCounter();
        return { count, increment };
      }
    }
    

4. TypeScript 支持

  • 选项式 API
    • 虽然可以与 TypeScript 配合使用,但由于各个选项部分是分开的,因此对类型推断和类型检查的支持相对较弱。
    • 复杂项目中使用 TypeScript 时,可能需要大量手动注释类型。
  • 组合式 API
    • 与 TypeScript 有更好的集成,尤其是在 setup 函数中,使用类型推断和显式类型声明非常自然。
    • 因为逻辑是集中在函数中,类型声明可以直接在函数参数和返回值中体现,类型推断更加准确和灵活。

5. 生命周期钩子

  • 选项式 API

    • 生命周期钩子直接定义为组件选项,如 mountedcreated 等。

    示例:

    export default {
      mounted() {
        console.log('Component mounted');
      }
    }
    

  • 组合式 API

    • setup 函数中使用生命周期钩子 API,比如 onMountedonUpdated 等。

    示例:

    import { onMounted } from 'vue';
    
    export default {
      setup() {
        onMounted(() => {
          console.log('Component mounted');
        });
      }
    }
    

6. 可读性和学习曲线

  • 选项式 API
    • 对于 Vue 初学者来说更直观,因为它以明确的选项块组织代码,结构清晰,易于理解。
    • 适合中小型项目或功能相对简单的应用。
  • 组合式 API
    • 对于初学者来说可能有一定的学习曲线,因为 setup 函数中将所有逻辑集中在一起,代码组织更加灵活。
    • 适合大型项目或功能复杂的应用,代码复用性更好。

7. 灵活性

  • 选项式 API
    • 相对固定的结构,在开发简单应用时足够使用,但面对复杂逻辑,复用和扩展较为困难。
  • 组合式 API
    • 提供了极大的灵活性,开发者可以按照功能模块自由组织代码,特别适合拆分复杂业务逻辑、增强代码可复用性。

总结

特性选项式 API组合式 API
语法风格通过选项(datamethodscomputed 等)通过 setup 函数组织逻辑,灵活自由
代码组织逻辑分散到不同选项块,直观但分散逻辑可以集中,适合复杂应用
逻辑复用通过 mixins 实现,但存在命名冲突问题通过组合函数复用逻辑,灵活且清晰
TypeScript 支持支持但较为局限原生支持更好,类型推断更精确
生命周期钩子使用选项 mountedcreatedsetup 中使用 onMounted 等 API
学习曲线易于上手,适合初学者需要一些学习成本,但适合复杂项目
适用场景小型项目,逻辑简单中大型项目,逻辑复杂,代码复用性强
  • 选项式 API 更适合新手和简单项目,代码逻辑较为直观和易维护。
  • 组合式 API 提供了更强的灵活性和复用能力,特别适合大型项目和复杂的业务逻辑。

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

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

相关文章

kernel32.dll的功能、作用,教大家几种修复kernel32.dll错误的办法

当这个文件出现问题时,用户可能会遇到各种错误消息,例如“缺失kernel32.dll”或“kernel32.dll发生错误”。这些错误不仅令人困扰,还可能威胁到您的数据安全和系统性能。接下来,本文将教大家几种修复kernel32.dll错误的有效方法&a…

群控系统服务端开发模式-业务流程图补充

进天有读者给我反馈,业务流程图看的不是很明确,所以我把未画完的业务流程图补充完毕。也希望以后更多的读者给我评论及意见。 一、业务流程梳理 1、非业务流程 a、添加部门、添加级别、添加执行方式。因为这些参数都是要被其他地方调用的,更…

word中的内容旋转90度

在vsto、Aspose.Words 中,默认没有直接的 API 可以让表格整体旋转 90 度。然而,我们可以通过一些方式来实现类似的效果,具体思路如下: 将表格插入到一个形状(Shape)或文本框中,然后旋转该形状。…

影刀RPA实战番外:excel函数应用指南

Excel函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如,SUM函数可以计算一系列数字的总和,IF函数进行逻辑测试,VLOOKUP函数在表格中查找数据&…

Oracle CONNECT BY、PRIOR和START WITH关键字详解

Oracle CONNECT BY、PRIOR和START WITH关键字详解 1. 基本概念2. 数据示例3. SQL示例3.1. 查询所有员工及其上级3.2. 显示层次结构3.3. 查询特定员工的子级 4. 结论 在Oracle数据库中,CONNECT BY、PRIOR和START WITH关键字主要用于处理层次结构数据,例如…

我悟了,华为FreeBuds 6i这样戴更稳了!

谁懂啊,才知道华为FreeBuds 6i标配多种尺寸的耳塞(如S、M、L),方便大家根据自己耳道大小自由选择。如果耳机戴上后感到耳朵不适或松动,可能是耳塞尺寸不匹配。 小提示: 耳塞过大 可能会造成压迫感&#xf…

kafka自定义配置信息踩坑

org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration acks: Expected value to be a string, but it was a java.lang.Integer 场景描述: 单个kafka使用springboot框架自带的 yml 配置完全OK(因为底层会帮我们处理好类…

CSS 设置网页的背景图片

背景 最近正好在写一个个人博客网站“小石潭记”,需要一张有水,有鱼的图片。正好玩原神遇到了类似场景,于是截图保存,添加到网站里面。以下是效果图: css 写个class,加到整个网页的body上 .bodyBg {ba…

接口测试 —— 如何测试加密接口?

接口加密是指在网络传输过程中,将数据进行加密,以保护数据的安全性。接口加密可以采用多种加密算法,如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。以下是一些详细的测试方法和注意事项: 接口加密字…

A-【项目开发知识管理】Android AIDL跨进程通信

Android AIDL跨进程通信 文章目录 Android AIDL跨进程通信0.我为啥要写这篇文章1.AIDL是干啥的?1.1简述1.2官方话 2.在AndroidStudio中怎么干?2.1准备工作2.2在项目A中创建AIDL文件夹2.3在项目A中创建一个aidl文件2.4将项目A进行一次Rebuild操作2.5在项目…

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中,如何规划自己的学习路线,才能在毕业时脱颖而出,成为行业的佼佼者呢? 第一学年:基础知识的奠基 1.1 课程安排 在大学的第一年,重…

超详解C++类与对象(下)

目录 1. 初始化列表 1.1. 定义 2.2. 注意 2. 隐式类型转换 2.1. 内置类型 2.2. 自定义类型 2.3. explicit关键字 3.类的静态成员 2.1. 定义 2.2. 注意 4.const成员函数 5. 友元 5. 1友元函数 5.2. 友元类 6. 内部类 6.1. 定义 6.2. 注意 7. 匿名对象 7…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长,话来说长。前些天我投了一些日常实习的简历,结果足足等了两个礼拜才收到面试通知,看来如今的行情确实是挺紧张的。当时我是满怀信心去的,心想这次一定要好好拷打面试官一番,结果没想到,自我…

一、python基础

python基础 认识Python1. Python介绍1.1 为什么学习Python1.2 Python发展历史 2. 语言分类简介2.1 编译型2.2 解释型 Python环境搭建1. Python 解释器1.1 Python解释器下载1.2 Python解释器安装 2. 解释器运行Python脚本2.1 演练步骤 PyCharm1. PyCharm介绍2. PyCharm安装3. Py…

15分钟学Go 第6天:变量与常量

第6天:变量与常量 在Go语言中,变量和常量是编程的基础概念。理解如何定义和使用它们不仅能帮助我们管理数据,还能增强代码的可读性和可维护性。在本章中,我们将详细探讨Go语言中的变量和常量,涵盖它们的定义、使用、作…

机器学习建模分析

机器学习 5.1 机器学习概述5.1.1 机器学习与人工智能5.1.2 python机器学习方法库 5.2 回归分析5.2.1 回归分析原理5.2.2 回归分析实现 5.3 分类分析5.3.1 分类学习原理5.3.2 决策树5.5.3 支持向量机 5.4 聚类分析5.4.1 聚类任务5.4.2 K-means算法 5.5 神经网络和深度学习5.5.1神…

python配合yolov11开发分类训练软件

上一篇文件写了用yolo分类模型开发分类软件,这边文章在上个分类软件的基础上加入训练功能环境配置:pycharm,PySide6 6.6.1 ,PySide6-Addons 6.6.1,PySide6-Essentials 6.6.1,torch 2.3.1cu121,torchaudio 2…

dynadot设置域名动态DNS(DDNS)

需求:本地测试代理,代理需要绑定IP或者域名,本地IP是动态变化的,解决办法就是给域名设置动态DNS 1.dynadot设置 开启动态DNS选项会显示动态DNS密码,该密码后续将会用在DDNS-GO工具上 2.DDNS-GO设置 GitHub介绍页面&a…

WIFI、NBIOT、4G模块调试AT指令连接华为云物联网服务器(MQTT协议)

一、前言 随着物联网(IoT)技术的飞速发展,越来越多的设备开始连接到互联网,形成了一个万物互联的世界。在这个背景下,设备与云端之间的通讯变得尤为重要。 本文将探讨几种常见的无线通信模块——EC20-4G、Air724ug-4…

每天花2分钟学数字化转型,第四讲:数字化转型

一文看懂:数字化转型是什么?以及数字化转型的根本任务与核心路径。 定义:数字化是人类社会的进化,绝不仅仅是一个企业的问题,也不是某一项技术的问题,而是时代的变迁。数字化转型指的是从当前信息化环境下…