当前位置: 首页 > news >正文

Vue3之组合式API详解

Vue 3引入了一种新的API风格——组合式API(Composition API),旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API,包括其定义、特点、使用场景、优势等,并给出具体的示例代码。

一、定义

组合式API是Vue 3中引入的一种新方法,旨在通过函数的方式将组件逻辑组织起来,使得代码更加灵活和可复用。与传统的选项式API(Options API)相比,组合式API提供了一种新的方式来组织和复用组件逻辑。

二、特点

1. 函数式组织

组合式API主要通过setup函数来组织组件逻辑。所有的组合式API都在setup函数中使用,该函数在组件实例创建之前调用。

2. 响应式状态

通过ref和reactive创建响应式状态,使得组件的数据能够自动更新视图。

3. 生命周期钩子

使用onMounted、onUpdated等函数来管理生命周期,替代了Vue 2中的mounted、updated等选项。

4. 依赖注入

通过provide和inject来实现依赖注入,使得组件之间可以共享数据和方法。

三、使用场景

1. 新项目与大型项目

对于新项目或大型项目来说,使用组合式API可能更加适合。因为它提供了更好的逻辑复用和组织能力,有助于构建可维护性更高、更易于扩展的代码库。

2. 需要复用逻辑的场景

如果你需要在多个组件中复用相同的逻辑,那么组合式API将是一个很好的选择。通过封装可复用的函数或对象,你可以轻松地在多个组件中共享这些逻辑。

3. TypeScript用户

如果你使用TypeScript进行Vue开发,那么组合式API将为你提供更好的类型检查和类型推断支持。

四、优势

1. 更好的逻辑复用

通过setup()函数和ref、reactive等API,可以将可复用的逻辑封装成独立的函数或对象,并在多个组件中重复使用。

2. 更清晰的逻辑组织

组合式API允许将相关的逻辑放在一起,而不是分散在多个选项中,使得代码更加紧凑和清晰。

3. 更好的TypeScript支持

由于组合式API是基于函数的,因此它更容易与TypeScript结合使用,提供更精准的类型推断和IDE自动补全功能。

4. 性能优化

Vue 3的响应式系统进行了重写,组合式API在性能上有所提升。通过精确追踪依赖关系,可以更好地优化组件的渲染和更新。

五、核心API的使用

组合式API包含了一系列核心函数,用于定义响应式数据、计算属性、侦听器等。以下是这些核心函数及其使用方法:

1. ref:用于定义基本类型的响应式数据。

import { ref } from 'vue';export default {setup() {const count = ref(0);return { count };}
}

2. reactive:用于定义复杂类型的响应式数据。

import { reactive } from 'vue';export default {setup() {const state = reactive({ count: 0, name: 'Vue' });return { state };}
}

3. computed:用于定义计算属性。

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

4. watch:用于监听响应式数据的变化。

import { ref, watch } from 'vue';export default {setup() {const count = ref(0);watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);});return { count };}
}

5. 生命周期钩子

  • onMounted:组件挂载后调用。
    import { onMounted } from 'vue';export default {setup() {onMounted(() => {console.log('Component mounted');});}
    }
    
  • onUpdated:组件更新后调用。
    import { onUpdated } from 'vue';export default {setup() {onUpdated(() => {console.log('Component updated');});}
    }
    
  • onUnmounted:组件卸载后调用。
    import { onUnmounted } from 'vue';export default {setup() {onUnmounted(() => {console.log('Component unmounted');});}
    }
    

六、代码示例

以下是一个完整的示例,展示了如何使用组合式API创建一个简单的计数器组件:

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const count = ref(0);function increment() {count.value++;}return { count, increment };}
}
</script>

在这个示例中,我们使用了ref来定义响应式的count变量,并通过increment函数来修改它。同时,setup函数返回count和increment,使得它们可以在模板中使用。

七、对比选项式API

为了更好地理解组合式API,我们可以将其与Vue 2中的选项式API进行对比。

1. 代码组织

  • 选项式API:组件逻辑是按照data、methods、computed、watch等分块写的,这种分离可能会导致相同功能的代码分散在不同的部分。
  • 组合式API:通过将相关的逻辑组合在一起,使代码更加紧凑和清晰,尤其是在复杂组件中,组织代码的方式更加自然。

2. 逻辑复用

  • 选项式API:复用逻辑通常使用mixin,但mixin存在作用域不清晰、命名冲突等问题。
  • 组合式API:提供了composable(可组合函数)的概念,允许将逻辑抽取成独立的函数,这样复用性更强、代码更清晰。

3. TypeScript支持

  • 选项式API:在TypeScript中的类型检查相对困难,因为Vue组件的选项是扁平化的。
  • 组合式API:基于函数的特性使其更容易与TypeScript结合使用,提供更精准的类型推断和IDE自动补全功能。

八、进阶使用

1. 自定义钩子

自定义钩子是一种将可复用逻辑封装成独立函数的方式。例如,我们可以将计数器逻辑抽离为一个独立的组合函数:

// useCounter.js
import { ref } from 'vue';export function useCounter() {const count = ref(0);const increment = () => {count.value++;};return { count, increment };
}

然后在组件中使用这个自定义钩子:

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script>
import { useCounter } from './useCounter';export default {setup() {const { count, increment } = useCounter();return { count, increment };}
}
</script>

这种模式极大地提高了代码的复用性和组织性。

2. 响应式引用和模板引用

在组合式API中,响应式引用和模板引用的概念是统一的。为了获得对模板内元素或组件实例的引用,可以像往常一样声明ref并从setup()返回:

<template><div ref="root">This is a root element</div>
</template><script>
import { ref, onMounted } from 'vue';export default {setup() {const root = ref(null);onMounted(() => {// DOM 元素将在初始渲染后分配给 refconsole.log(root.value); // <div>This is a root element</div>});return { root };}
}
</script>

在这个示例中,我们在渲染上下文中暴露root,并通过ref="root"将其绑定到div元素上。作为模板使用的ref的行为与任何其他ref一样:它们是响应式的,可以传递到(或从中返回)组合函数中。

九、总结

Vue 3的组合式API提供了一种更加灵活和强大的方式来组织和复用组件逻辑。通过setup函数和一系列的响应式API,可以使代码更加简洁和易于维护。以下是一些总结和建议:

  1. 新项目优先:对于新项目,建议优先考虑使用组合式API,以利用其逻辑复用和组织能力的优势。
  2. 逐步迁移:对于现有项目,可以逐步将部分组件迁移到组合式API,以提高代码的可维护性和复用性。
  3. 结合TypeScript:如果你使用TypeScript进行Vue开发,建议充分利用组合式API的类型支持优势,以提高开发效率和减少潜在的错误。
  4. 不断实践和学习:通过实际项目中的应用来加深理解,并详细阅读Vue 3官方文档,了解每个API的用法和背后的原理。

通过不断实践和学习,我们会发现组合式API在开发效率和代码质量上的巨大提升。

相关文章:

Vue3之组合式API详解

Vue 3引入了一种新的API风格——组合式API&#xff08;Composition API&#xff09;&#xff0c;旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API&#xff0c;包括其定义、特点、使用场景、优势等&#xff0c;并给出具体的示例代码。 一、定义 组合式…...

大模型的构建与部署(3)——数据标注

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…...

AI发展与LabVIEW程序员就业

人工智能&#xff08;AI&#xff09;技术的快速发展确实对许多行业带来了变革&#xff0c;包括自动化、数据分析、软件开发等领域。对于LabVIEW程序员来说&#xff0c;AI的崛起确实引发了一个值得关注的问题&#xff1a;AI会不会取代他们的工作&#xff0c;导致大量失业&#x…...

本地事务 + 消息队列事务方案设计

Spring Boot 和 RocketMQ 在Spring Boot项目中实现“本地事务 消息队列事务”的方案&#xff0c;可以按照以下步骤实现&#xff1a; 先执行MySQL本地事务操作&#xff08;未提交&#xff09;随后发送消息到消息队列&#xff08;如RocketMQ事务消息&#xff09;等待消息队列确…...

pinctrl子系统学习笔记

一、背景 cpu的gpio引脚可以复用成多个功能&#xff0c;如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器&#xff0c;但是不同芯片厂商配置寄存器格式内容各不相同&#xff0c;设置引脚复用无法做到通用且自由的配置&#xff0c;只能在启动初始化…...

使用vue-element 的计数器inputNumber,传第三个参数

使用vue-element 的计数器inputNumber。 其中的change 事件中&#xff0c;默认自带两个参数&#xff0c;currentValue和oldValue&#xff0c;分别代表改变后的数和改变前的数&#xff0c; 如果想要传第三个参数&#xff0c; change"(currentValue, oldValue) > numCha…...

如何从0构建一个flask项目,直接上实操!!!

项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; flask_app/ │ ├── app.py # Flask 应用代码 ├── static/ # 存放静态文件&#xff08;如CSS、JS、图片等&#xff09; │ └── style.css # 示例…...

Mongoose连接数据库操作实践

文章目录 介绍特点&#xff1a;Mongoose 使用&#xff1a;创建项目并安装&#xff1a;连接到 MongoDB&#xff1a;定义 Schema&#xff1a;创建模型并操作数据库&#xff1a;创建文档&#xff1a;查询文档&#xff1a;更新文档&#xff1a;删除文档&#xff1a;使用钩子&#x…...

centos 7.9 freeswitch1.10.9环境搭建

亲测版本centos 7.9系统–》 freeswitch1.10.9 一、下载插件 yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2...

Gitlab服务管理和仓库项目权限管理

Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件&#xff1b; gitlab-ctl stop # 停止所有 gitlab 组件&#xff1b; gitlab-ctl restart # 重启所有 gitlab 组件&#xff1b; gitlab-ctl status …...

LLMs之Llama-3:Llama-3.3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama-3&#xff1a;Llama-3.3的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之LLaMA&#xff1a;LLaMA的简介、安装和使用方法、案例应用之详细攻略 LLMs之LLaMA-2&#xff1a;LLaMA 2的简介(技术细节)、安装、使用方法(开源-免费用于研究和商业用途…...

OpenCV函数及其应用

1. 梯度处理的Sobel算子函数 功能 Sobel算子是一种用于边缘检测的离散微分算子&#xff0c;它结合了高斯平滑和微分求导&#xff0c;用于计算图像亮度的空间梯度。 参数 src&#xff1a;输入图像。 dst&#xff1a;输出图像。 ddepth&#xff1a;输出图像的深度。 dx&#xff…...

vulnhub靶场【DriftingBlues】之3

前言 靶机&#xff1a;DriftingBlues-3&#xff0c;IP地址192.168.1.60 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...

文件上传—阿里云OSS对象存储

目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成&#xff0c;上传一张图片&#xff0c;检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码&#xff1a; …...

mybatis-plus超详细讲解

mybatis-plus &#xff08;简化代码神器&#xff09; 地址&#xff1a;https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …...

【Linux】--- 进程的概念

【Linux】--- 进程的概念 一、进程概念二、PCB1.什么是PCB2.什么是task_struct&#xff08;重点&#xff01;&#xff09;3.task_struct包含内容 三、task_struct内容详解1.查看进程&#xff08;1&#xff09;通过系统目录查看&#xff08;2&#xff09;通过ps命令查看&#xf…...

Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件

无后端高效获取网络时间的组件 废话不多说&#xff0c;直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移&#xff0c; 比如北京时区就是 8, 巴西就是-3&#xff0c;美国就是-5using Newtonsoft.Json; 如果这里报错&#xff0c; 就说明项目没有 NewtonsoftJson插件…...

go语言使用zlib压缩[]byte

在Go语言中&#xff0c;可以使用compress/flate和compress/zlib包来实现对[]byte数据的Zlib压缩。下面是一个简单的示例&#xff0c;展示如何使用这些包来压缩一个字节切片&#xff1a; go package main import ( "bytes" "compress/zlib" "fmt"…...

Windows 配置 Tomcat环境

Windows配置Tomcat 1. 介绍 Tomcat是一个开源的、轻量级的Java应用服务器&#xff0c;在Java Web开发领域应用广泛。以下是关于它的详细介绍&#xff1a; 一、基本概念与背景 定义&#xff1a;Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;下…...

【python从入门到精通】-- 第六战:列表和元组

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...