当前位置: 首页 > 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; 坚持…...

Python | 数据可视化中常见的4种标注及示例

在Python的数据可视化中&#xff0c;标注&#xff08;Annotation&#xff09;技术是一种非常有用的工具&#xff0c;它可以帮助用户更准确地解释图表中的数据和模式。在本文中&#xff0c;将带您了解使用Python实现数据可视化时应该了解的4种标注。 常见的标注方式 文本标注箭…...

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器,实例化)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量&#xff0c;用于控制渲染 GL_POINTS 型图元时&#xff0c;点的大小。可用于粒子系统。将其设置为 gl_Position.z 时&#xff0c;可以使点…...

Scala学习记录

dao --------> 数据访问 mode ------> 模型 service ---->业务逻辑 Main -------> UI:用户直接操作&#xff0c;调用Service 改造UI层&#xff1a;...

vue使用pdfh5.js插件,显示pdf文件白屏

pdfh5&#xff0c;展示文件白屏&#xff0c;无报错 实现效果图解决方法(降版本)排查问题过程发现问题查找问题根源1、代码写错了&#xff1f;2、预览文件流的问题&#xff1f;3、pdfh5插件更新了&#xff0c;我的依赖包没更新&#xff1f;4、真相大白 彩蛋 实现效果图 解决方法…...

docker login 出错 Error response from daemon

在自己的Linux服务器尝试登陆docker出错 输入完用户密码之后错误如下&#xff1a; 解决方案 1.打开daemo文件&#xff1a; vim/etc/docker/daemon.json 2.常用的国内Docker 镜像源地址 网易云 Docker 镜像&#xff1a;http://hub-mirror.c.163.com 百度云 Docker 镜像&#x…...

Web 身份认证 --- Session和JWT Token

Web 身份认证 --- Session和JWT Token 方法一: 通过使用Session进行身份认证方法二: 通过JWT token进行身份认证什么是JWTJWT完整流程JWT攻防JWT 如何退出登录JWT的续签 方法一: 通过使用Session进行身份认证 用户第一次请求服务器的时候&#xff0c;服务器根据用户提交的相关信…...

UE5制作倒计时功能

设置画布和文本 文本绑定 格式化时间 转到事件图表&#xff0c;计算时间&#xff0c;时间结束后面的事件可以按自己需求写 进入关卡蓝图&#xff0c;添加倒计时UI...

Linux去除注释和空行

平时查看某些配置文件的时&#xff0c;我们会发现有很多注释&#xff08;如&#xff1a;"#"开头的行&#xff09;&#xff0c;中间还有很多空行&#xff0c;看起来非常费劲&#xff0c;所以在这里总结下如何去除注释和空行的方法。 举例说明 这里选个简单点的文件&a…...

Elasticsearch 7.x入门学习-Spring Data Elasticsearch框架

1 Spring Data框架 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计算数据服务。 Spring Data 可以极大的简化 JPA的写法&#xff0c;…...

网络层IP协议(TCP)

IP协议&#xff1a; 在了解IP协议之前&#xff0c;我们市面上看到的"路由器"其实就是工作在网络层。如下图&#xff1a; 那么网络层中的IP协议究竟是如何发送数据包的呢&#xff1f; IP报头&#xff1a; IP协议的报头是比较复杂的&#xff0c;作为程序猿只需要我们重…...