VueUse/Core:提升Vue开发效率的实用工具库
文章目录
- 引言
- 什么是VueUse/Core?
- 为什么选择VueUse/Core?
- 核心功能详解
- 1. 状态管理
- 2. 元素操作
- 3. 实用工具函数
- 4. 浏览器API封装
- 5. 传感器相关
- 实战示例:构建一个拖拽上传组件
- 性能优化技巧
- 与原生实现对比
- 常见问题解答
- 总结
引言
在现代前端开发中,Vue.js
因其简洁的API和响应式系统而广受欢迎。然而,在日常开发中,我们经常会遇到一些重复性的需求,如表单处理、事件监听、状态管理等。这时候,一个高质量的实用工具库可以显著提升我们的开发效率。VueUse/Core
正是这样一个为 Vue
开发者量身定制的工具集合。
什么是VueUse/Core?
VueUse/Core
是一个基于 Composition API
的Vue实用函数集合,它提供了一系列可复用的组合式函数,涵盖了常见的开发需求。这个库由 Anthony Fu
创建并维护,已经成为 Vue生态
中最受欢迎的工具库之一。
官方地址:https://vueuse.nodejs.cn/
为什么选择VueUse/Core?
- 开箱即用的实用功能:无需重复造轮子,直接使用经过社区验证的解决方案
- 完美的Composition API集成:专为Vue 3设计,同时也支持Vue 2.7+
- 极小的体积:
Tree-shakable
设计,只打包你使用的函数 - 优秀的TypeScript支持:完整的类型定义,提升开发体验
- 活跃的社区:持续更新,不断添加新功能
核心功能详解
1. 状态管理
VueUse
提供了多种状态管理方案,比 Vuex
或 Pinia
更轻量,适合简单场景。
import { useStorage } from '@vueuse/core'// 自动持久化到localStorage
const count = useStorage('my-count', 0)
useStorage
会自动将状态同步到 localStorage
或 sessionStorage
,实现持久化状态。
2. 元素操作
import { useMouse, useElementVisibility } from '@vueuse/core'const { x, y } = useMouse() // 跟踪鼠标位置const isVisible = useElementVisibility(refElement) // 元素是否可见
3. 实用工具函数
import { useDebounceFn, useThrottleFn } from '@vueuse/core'const debouncedFn = useDebounceFn(() => {// 防抖逻辑
}, 500)const throttledFn = useThrottleFn(() => {// 节流逻辑
}, 500)
4. 浏览器API封装
import { useClipboard, usePreferredDark } from '@vueuse/core'const { copy, isSupported } = useClipboard()const isDark = usePreferredDark() // 检测用户是否偏好暗色主题
5. 传感器相关
import { useDeviceMotion, useBattery } from '@vueuse/core'const motion = useDeviceMotion() // 设备运动传感器
const battery = useBattery() // 电池状态
实战示例:构建一个拖拽上传组件
让我们通过一个实际例子来展示 VueUse
的强大功能。
<template><div ref="dropZoneRef":class="{ 'active': isOverDropZone }"@click="openFileDialog"><input type="file" ref="inputRef"style="display: none" @change="handleFileChange"/><p>拖拽文件到这里或点击上传</p><div v-if="files.length"><div v-for="file in files" :key="file.name">{{ file.name }} ({{ formatFileSize(file.size) }})</div></div></div>
</template><script setup>
import { ref } from 'vue'
import { useDropZone,useFileDialog,useFileSystemAccess,useObjectUrl
} from '@vueuse/core'const dropZoneRef = ref(null)
const inputRef = ref(null)
const files = ref([])const { isOverDropZone } = useDropZone(dropZoneRef, (files) => {handleFiles(files)
})const { open, onChange } = useFileDialog({accept: 'image/*',multiple: true
})onChange((files) => {handleFiles(files)
})function handleFiles(newFiles) {files.value = [...files.value, ...newFiles]
}function formatFileSize(bytes) {if (bytes === 0) return '0 Bytes'const k = 1024const sizes = ['Bytes', 'KB', 'MB', 'GB']const i = Math.floor(Math.log(bytes) / Math.log(k))return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}function openFileDialog() {open()
}
</script><style scoped>
.active {border: 2px dashed #42b983;background-color: rgba(66, 185, 131, 0.1);
}
</style>
这个示例展示了如何使用多个 VueUse
函数快速构建一个功能丰富的拖拽上传组件。
性能优化技巧
- 按需导入:VueUse支持
Tree-shaking
,只导入你需要的函数
import { useDebounceFn } from '@vueuse/core' // 正确
import VueUse from '@vueuse/core' // 避免这样导入
-
合理使用防抖和节流:对于频繁触发的事件,使用
useDebounceFn
或useThrottleFn
-
及时清理副作用:
VueUse
会自动清理大部分副作用,但对于自定义监听器,记得在onUnmounted
中清理 -
利用共享状态:对于全局状态,考虑使用
createSharedComposable
创建共享实例
与原生实现对比
让我们比较一下原生实现和使用 VueUse
的实现差异:
原生实现鼠标跟踪:
import { ref, onMounted, onUnmounted } from 'vue'const x = ref(0)
const y = ref(0)function update(e) {x.value = e.pageXy.value = e.pageY
}onMounted(() => {window.addEventListener('mousemove', update)
})onUnmounted(() => {window.removeEventListener('mousemove', update)
})
使用 VueUse:
import { useMouse } from '@vueuse/core'const { x, y } = useMouse()
显然,VueUse
版本更简洁,且不需要手动管理事件监听器的生命周期。
常见问题解答
Q: VueUse适合生产环境吗?
A: 是的,VueUse
已经在许多生产环境中使用,并且有良好的测试覆盖率。
Q: VueUse会增加多少打包体积?
A: 由于 Tree-shaking
支持,你只打包你使用的函数。单个函数通常只有几KB。
Q: 如何贡献自己的函数?
A: VueUse是开源项目,欢迎通过 GitHub
提交PR。确保你的函数有良好的TypeScript支持和测试用例。
总结
VueUse/Core
是一个强大而灵活的 Vue
工具库,它通过提供一系列精心设计的组合式函数,极大地提升了 Vue
开发的效率和体验。无论你是需要处理常见的UI交互,还是需要访问浏览器API,VueUse
都能提供简洁优雅的解决方案。
通过本文的介绍,你应该已经了解了 VueUse
的核心功能和优势。建议从官方文档开始,逐步尝试将 VueUse
集成到你的项目中,体验它带来的开发效率提升。
希望这篇文章能帮助你更好地理解和使用 VueUse/Core
。如果你有任何问题或建议,欢迎在评论区留言讨论!
相关文章:
VueUse/Core:提升Vue开发效率的实用工具库
文章目录 引言什么是VueUse/Core?为什么选择VueUse/Core?核心功能详解1. 状态管理2. 元素操作3. 实用工具函数4. 浏览器API封装5. 传感器相关 实战示例:构建一个拖拽上传组件性能优化技巧与原生实现对比常见问题解答总结 引言 在现代前端开发…...
记录一次win11本地部署deepseek的过程
20250518 win11 docker安装部署 ollama安装 ragflow部署 deepseek部署 文章目录 1 部署Ollama下载安装ollama配置环境变量通过ollama下载模型deepseek-r1:7b 2 部署docker2.1 官网下载amd版本安装2.2 配置wsl2.3 Docker配置:位置代理镜像源 3 部署RAGFlow更换ragfl…...
PrimeVul论文解读-如何构建高质量漏洞标签与数据集
目录 1. 引入2. 现有漏洞识别方案的不足2.1 数据集中label不准2.2 数据重复2.3 测评标准不够好 3. 现有漏洞识别数据集分析3.1 关于现有数据集中label的准确率分析3.2 关于现有数据集中数据泄露( Data Leakage)情况分析 4. 漏洞识别测评5. PrimeVul数据集…...
现代生活健康养生新视角
在科技飞速发展的今天,我们的生活方式发生巨大转变,健康养生也需要新视角。从光线、声音等生活细节入手,能为健康管理开辟新路径。 光线与健康密切相关。早晨接触自然光线,可调节生物钟,提升血清素水平,…...
开启健康生活的多元养生之道
健康养生是一门值得终身学习的学问,在追求健康的道路上,除了常见方法,还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道,能让我们的生活更健康、更有品质。 室内环境的健康不容忽视。定期清洁空调滤网,避…...
Flink 并行度的设置
在 Apache Flink 中,并行度(Parallelism) 是控制任务并发执行的核心参数之一。Flink 提供了 多个层级设置并行度的方式,优先级从高到低如下: 🧩 一、Flink 并行度的四个设置层级 层级描述设置方式Operator…...
抖音视频怎么去掉抖音号水印
你是不是经常遇到这样的烦恼?看到喜欢的抖音视频,想保存下来分享给朋友或二次创作,却被抖音号水印挡住了画面?别着急,今天教你几种超简单的方法,轻松去除水印,高清无水印视频一键保存࿰…...
类的加载过程详解
类的加载过程详解 Java类的加载过程分为加载(Loading)、链接(Linking) 和 初始化(Initialization) 三个阶段。其中链接又分为验证(Verification)、准备(Preparation&…...
运行:MSI Afterburner报错:应用程序无法启动并行配置不正确
从日志中可以看出,MSI Afterburner 运行时因缺少关键依赖组件(Microsoft.VC90.MFC)导致激活上下文生成失败。这是典型的 Visual C 运行时库缺失/版本不匹配 问题,与您提到的 for %1 in (%windir%\system32\*.dll) do regsvr32.exe…...
基于智能家居项目 ESP8266 WiFi 模块通信过程与使用方法详解
一、ESP8266 简介 ESP8266 是由乐鑫科技(Espressif)推出的一款低功耗、高集成度的 WiFi SoC 芯片。它内置 TCP/IP 协议栈,支持 STA(Station)、AP(Access Point)和 STA+AP 混合模式,可以独立作为主控 MCU 或配合其它主控(如 STM32、Arduino)通过串口通信使用。 常见…...
字节跳动开源通用图像定制模型DreamO,支持风格转换、换衣、身份定制、多条件组合等多种功能~
项目背景分析 图像定制是一个快速发展的领域,包括身份(ID)、风格、服装试穿(Try-On)等多种任务。现有研究表明,大规模生成模型在这些任务上表现出色,但大多数方法是任务特定的,难以推…...
Cursor:简单三步提高生成效率
第一步:结构化提示词——像写需求文档一样对话 常见误区:“做个知识管理模块,用SpringBoot。” 问题:AI会陷入迷茫——需要哪些字段?分页怎么做?异常处理是否需要? 正确写法: Note C…...
第二章 苍穹外卖
开发环境搭建_后端环境搭建_熟悉项目结构 constant:存储的是定义好的常量类 context:存储与上下文相关的 enumeration:存储枚举类 exception:存储一些异常 json:处理一些json转换的类 properties:存储一些配置类 …...
【上位机——WPF】命名空间
概述 XAML命名空间实际上是XML命名空间概念的扩展。指定XAML命名空间的技术依赖于XML命名空间语法、使用URL作为命名空间标识符的约定,使用前缀提供从同一标记源中引用多个命名空间的方法,诸如此类,XML命名空间的XAML定义中增加的主要概念是…...
当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强
原论文:s1: Simple test-time scaling 作者:Niklas Muennighoff, Zitong Yang, Weijia Shi等(斯坦福大学、华盛顿大学、Allen AI研究所、Contextual AI) 论文链接:arXiv:2501.19393 代码仓库:GitHub - simp…...
【聚类】 K-means
K-means 文章目录 K-means1. 算法介绍2. 公式及原理3. 伪代码1. 算法介绍 背景与目标 K-means 是最经典、最常用的原型聚类(prototype-based clustering)算法之一,由 Stuart Lloyd 于1957年提出,1982年被广泛推广。其核心目标是: 将给定的 n n n 个数据点划分为 K K K 个…...
matlab分段函数
在 MATLAB 中,定义分段函数可以使用 piecewise 函数或者条件语句(如 if、else)来实现。以下是两种常见方法的示例: 1. 使用 piecewise 函数(适用于符号函数) syms x f piecewise(x < 0, x^2, x > …...
《Vite 报错》ReferenceError: module is not defined in ES module scope
trip): [ReferenceError] module is not defined in ES module scope 解决方案 postcss.config.js 要改为 postcss.config.cjs,也就是 .cjs 后缀。 原因解析 原因解析 下图提示,packages.json 中的属性 type 设置为 module。所有*.js文件现在都被解释…...
基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
一、引言概述。 锂电池是目前在各个能源密集型行业中用途广泛,例如新能源汽车、电力微网、航空航天等。电池模型的建立对研究电池的特性、SOC(state-of-charge)估计、SOH(state-of-health)估计、BMS算法开发以及电池系统的快速实时仿真有重要的意义。 等效电路建模…...
10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析
LangChain Community 项目:Model I/O, Retrieval, Agent Tooling 关键词:LangChain Model I/O, 检索增强生成, Agent 工具链, 多路召回策略, 工具调用协议 1. Model I/O 模块:大模型交互标准化接口 Model I/O 是 LangChain 生态中连接大模型的核心模块,定义了统一的输入输…...
408考研逐题详解:2009年第16题
2009年第16题 某机器字长为 16 位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一个字节为操作码字段,第二个字节为相对位移量字段。假定取指令时,每取一个字节 PC 自动加 1。若某转移指令所在…...
python打卡day29@浙大疏锦行
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
双紫擒龙紫紫红指标源码学习,2025升级版紫紫红指标公式-重点技术
VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 双紫擒龙:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…...
Redis学习打卡-Day3-分布式ID生成策略、分布式锁
分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时,就需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…...
在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件
ASP.NET 中 HttpHandler 的用法详解 在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件。根据你的配置文件,我将详细解释 <handlers> 节点的各种用法和配置选项。 1. HttpHandler 概述 HttpHandler 是…...
Word文档图片和图表自动添加序号
0 Preface/Foreword Word文档是办公常用的文档,里面经常会插入图片或者表格,当表格和图片数量过多时,如果有些图片需要删除或者添加,那么大概率需要修改大量图片的序号或者引用记录,如果通过手工一个一个修改…...
Android开发-列表类视图
在Android应用开发中,列表类视图(List View) 是展示数据集的重要UI组件之一。无论是显示联系人列表、新闻文章还是产品目录,列表类视图都能提供一个高效且用户友好的方式来呈现信息。本文将详细介绍如何使用 ListView 和更现代的 …...
如何使用 Apple 提供的 benchmark 工具
目录 🧭 Apple 提供的 benchmark 工具有哪些? ✅ 方式一:使用 Core ML Benchmark Tool(推理性能测试) 🔧 安装方式(推荐用 Python 工具) ✅ 方式二:使用 Instruments…...
第11章 JDBC与MySQL数据库
11.1 MySQL数据库管理系统 11.2 启动MySQL数据库服务器 在MySQL安装目录的bin子目录下键入mysqld或mysqld -nt 启动MySQL数据库服务器。 11.3 MySQL客户端管理工具 11.4 JDBC 对于JDK8版本,可以数据库连接器到JDK的扩展目录中(即JAVA_HOME环境变量指…...
Python 向量化操作如何实现多条件筛选
在处理大量数据时,高效的数据筛选是数据分析和科学计算中的关键环节。Python 的 numpy 库以其强大的向量化操作功能,能够帮助我们快速、高效地实现多条件筛选,避免使用低效的循环结构。 NumPy 向量化操作与布尔筛选基础 NumPy 是 Python 中用…...
内容社区系统开发文档(下)
目录 4 系统测试 4.1 数据库测试设计 测试流程图 测试策略矩阵 4.2 数据库测试内容 测试点 1:数据项增删改查(CRUD)操作 和 数据一致性测试 一、基础数据初始化 二、用户表测试(users) 1. 新增用户 2. 更新…...
什么是迁移学习(Transfer Learning)?
什么是迁移学习(Transfer Learning)? 一句话概括 迁移学习研究如何把一个源领域(source domain)/源任务(source task)中获得的知识迁移到目标领域(target domain)/目标任…...
CMake调试与详细输出选项解析
在使用 CMake 进行项目构建和编译时,--debug-output 和 --verbose 的作用如下: 1. --debug-output 适用阶段:CMake 配置阶段(运行 cmake 命令生成构建系统时)。作用: 启用 CMake 内部的调试输出࿰…...
Elasticsearch进阶篇-DSL
目录 DSL查询 1 快速入门 2 DSL 查询分类 2.1 叶子查询 2.1.1 全文检索查询 语法 举例 2.1.2 精准查询 term 语法 term 示例 range 语法 range 示例 2.2 复合查询 2.2.1 bool查询 举例 2.3 排序 语法 示例 2.4 分页 2.4.1 基础分页 示例 2.4.2 深度分页 …...
2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)
2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 一、单项选择题(每题 5 分) C++ 程序流程控制的基本结构不包括以下哪项? A. 分支结构 B. 数据结构 C. 循环结构 D. 顺序结构 以下哪段代码能将数组 int a[4] = {2, 4, 6, 8}; 的所有元素变…...
C++ 二分查找:解锁高效搜索的密码
一、引言 在 C 编程的广阔领域中,数据处理和查找是日常开发中极为常见的操作。想象一下,你有一个包含数百万个数据的有序数组,需要从中快速找到特定的元素,如果采用逐个遍历的方式,效率之低可想而知,而二分…...
YOLO12改进-模块-引入Channel Reduction Attention (CRA)模块 降低模型复杂度,提升复杂场景下的目标定位与分类精度
在语义分割任务中,基于 Transformer 的解码器需要捕获全局上下文信息,但传统自注意力机制(如 SRA)因高分辨率特征图导致计算成本高昂。现有方法多通过降低空间分辨率减少计算量,但未充分优化通道维度。为平衡全局上下文…...
sparkSQL读入csv文件写入mysql
思路 示例 (年龄>18改成>20) mysql的字符集问题 把user改成person “让字符集认识中文”...
如何确定自己的职业发展方向?
引言 确定职业发展方向是一个需要深度自我探索和外部信息结合的过程。以下是系统化的思考框架和行动步骤,帮助你逐步清晰方向: 一、核心问题:职业方向的本质是什么? 职业方向的核心是找到 “你能做什么”(能力&…...
【LLIE专题】基于Retinex理论的transformer暗光增强
Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement(2023,ICCV) 专题介绍一、研究背景二、Retinexformer方法1. 通用Retinex理论2. 作者建立的Retinex理论3. ORF(one stage Retinex-based Framework)4. 网…...
C++多态与虚函数详解——从入门到精通
C多态与虚函数详解——从入门到精通 引言 在C面向对象编程中,多态是一个核心概念,它赋予了程序极大的灵活性和扩展性。本文将通过六个精心设计的实例,深入浅出地讲解C中的多态、虚函数、继承和抽象类等概念,帮助初学者快速理解这…...
自适应Prompt技术:让LLM精准理解用户意图的进阶策略
开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流 来自全栈程序员 nine 的探索与实践,持续迭代中。 欢迎关注评论私信交流~ 一、核心挑战:传统Prompt的局限性 传统静态Prompt&…...
Java文件读写程序
1.引言 在日常的软件开发中,文件操作是常见的功能之一。不仅要了解如何读写文件,更要知道如何安全地操作文件以避免程序崩溃或数据丢失。这篇文章将深入分析一个简单的 Java 文件读写程序 Top.java,包括其基本实现、潜在问题以及改进建议&am…...
数字电子技术基础(六十)——使用Digital软件绘制脉冲触发的触发器
目录 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发器 1.2 使用Digitial软件绘制脉冲触发的JK触发器 1.3 使用Digital软件绘制脉冲触发D触发器 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发…...
C++学习:六个月从基础到就业——C++20:范围(Ranges)基础
C学习:六个月从基础到就业——C20:范围(Ranges)基础 本文是我C学习之旅系列的第五十一篇技术文章,也是第三阶段"现代C特性"的第十三篇,介绍C20引入的范围(Ranges)库的基础知识。查看完整系列目录了解更多内容。 引言 S…...
【AGI】模型性能评估框架EvalScope
【AGI】模型性能评估框架EvalScope 项目地址:https://github.com/modelscope/evalscope EvalScope 是由阿里巴巴魔搭社区(ModelScope)推出的一款开源模型评估框架,旨在为大语言模型(LLM)和多模态模型提供…...
【老马】离线版金融敏感信息加解密组件开源项目 encryption-local
前言 你是否存在这样的苦恼,数据需要安全存储,但是每个系统大家自己写,很浪费时间。。 每一个子项目各自为政,加解密搞得也无法统一。也许下面这个开源项目可以帮助你。 encryption-local 一个离线版本的金融敏感信息加解密工具…...
利用systemd启动部署在服务器上的web应用
0.背景 系统环境: Ubuntu 22.04 web应用情况: 前后端分类,前端采用react,后端采用fastapi 1.具体配置 1.1 前端配置 开发态运行(启动命令是npm run dev),创建systemd服务文件 sudo nano /etc/systemd/…...
YOLOv5目标构建与损失计算
YOLOv5目标构建与损失计算 YOLOv5目标构建与损失计算构建目标关键步骤解析: 计算损失关键实现细节解析各损失分量说明 YOLOv5目标构建与损失计算 YOLOv5作为单阶段目标检测的经典算法,其高效的检测性能离不开精心设计的训练目标构建和损失计算策略。本文…...
【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?
目录 一、什么是库? 1. C标准库(libc) 2. C标准库(libstdc) 二、静态库 1. 静态库的生成 2. 静态库的使用 三、动态库 1. 动态库的生成 2. 动态库的使用 3. 库运行的搜索路径。 (1)原因…...