当前位置: 首页 > 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】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...