VueUse onLongPress 详解:元素长按检测的 Hook、组件与指令三种用法
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读onLongPress是 VueUseVue 3 组合式工具集中用于监听元素长按Long Press的核心工具位于vueuse/core的 Sensors传感器分类下。它基于浏览器 Pointer Events指针事件实现对鼠标、触屏与触控笔统一生效覆盖 Web 端长按交互最常见的三类诉求触发长按回调、限制移动距离阈值、在抬起时回调统计。读完本文你将掌握onLongPress的函数式 Hook、OnLongPress组件与vOnLongPress指令三种使用姿势以及delay、distanceThreshold、onMouseUp、modifiers等全部选项的底层行为与测试验证方式。一、功能定位与基本用法onLongPress(target, handler, options?)用于在元素上监听长按触发时回调handler并返回一个stop函数用于移除全部监听器。官方文档对它的描述是Listen for a long press on an element. Returns a stop function.基础 Hook 用法在script setup中通过useTemplateRef获取模板引用再调用onLongPressscript setup langts import { onLongPress } from vueuse/core import { shallowRef, useTemplateRef } from vue const htmlRefHook useTemplateRef(htmlRefHook) const longPressedHook shallowRef(false) function onLongPressCallbackHook(e: PointerEvent) { longPressedHook.value true } function resetHook() { longPressedHook.value false } onLongPress( htmlRefHook, onLongPressCallbackHook, { modifiers: { prevent: true } } ) /script template pLong Pressed: {{ longPressedHook }}/p button refhtmlRefHook classml-2 button small Press long /button button classml-2 button small clickresetHook Reset /button /template要点说明target类型为MaybeElementRef见 packages/core/onLongPress/index.ts即既可以直接传 DOM 元素也可以传元素 ref。源码内部通过computed(() unrefElement(target))与 unrefElement 将 ref 统一解析为真实元素因此测试中传 ref与直接传元素两种方式行为一致index.test.ts 分别以 ref 和非 ref 参数跑完整测试套件。handler收到的是原生PointerEvent对象可从中读取clientX、pointerType等信息。返回值OnLongPressReturn即() void调用后清除所有事件监听UseOnLongPressReturn是它的弃用别名仅供向后兼容见 index.ts。二、核心选项详解OnLongPressOptions共包含四个字段delay、distanceThreshold、onMouseUp与modifiers。完整类型声明见 packages/core/onLongPress/index.ts下面是逐一拆解。1. delay长按判定时间默认值500ms源码常量DEFAULT_DELAY见 index.ts。类型number | ((ev: PointerEvent) number)。当传入函数时会在每次pointerdown时以当前事件为参数求值源码getDelay函数index.ts从而实现触屏 800ms、鼠标 500ms这类按指针类型区分的动态延迟import { onLongPress } from vueuse/core // Fixed delay onLongPress(target, handler, { delay: 1000 }) // Dynamic delay based on event onLongPress(target, handler, { delay: ev ev.pointerType touch ? 800 : 500, })测试用例 triggerCallbackWithDelay 验证了设置delay: 1000后按住 500ms 不触发、抬起后也不触发重新按住满 1000ms 才触发一次同时验证了delay为函数时返回 2000同样按函数结果生效。2. distanceThreshold移动距离阈值默认值10像素源码常量DEFAULT_THRESHOLDindex.ts。类型number | false。行为长按进行中若指针相对按下点的位移欧氏距离达到或超过阈值则取消长按清除计时器设为false则完全禁用移动检测手指即使大幅拖动也会在延迟期满后照常触发。import { onLongPress } from vueuse/core // Custom threshold onLongPress(target, handler, { distanceThreshold: 20 }) // Disable movement detection onLongPress(target, handler, { distanceThreshold: false })底层逻辑在onMove中index.ts通过ev.x - posStart.x与ev.y - posStart.y计算距离平方和的平方根distance (options?.distanceThreshold ?? DEFAULT_THRESHOLD)时调用clear()取消计时。测试 triggerCallbackWithThreshold 验证了超出阈值移动后长按不触发而阈值内的小幅移动distanceThreshold: 15下移动约 7.8px不影响触发。3. onMouseUp抬起时回调onMouseUp在指针释放或离开、取消时被调用签名如下onLongPress(target, handler, { onMouseUp(duration, distance, isLongPress, pointerEvent) { console.log(Held for ${duration}ms, moved ${distance}px, long press: ${isLongPress}, x: ${pointerEvent.clientX}) }, })四个参数分别表示参数含义duration按住时长ms由ev.timeStamp - startTimestamp计算index.tsdistance相对按下点的移动距离pxisLongPress是否成功判定为长按即计时器是否已触发过pointerEvent触发释放的原生 PointerEvent这一回调非常适合实现区分点击与长按的交互isLongPress false时视为普通点击。仓库演示 demo.vue 正是用它区分 click 与 long press。注意源码在onRelease中先执行clear()再回调index.ts因此该回调对长按已触发与提前释放两种情况都能感知。测试 triggerOnMouseUp 验证了duration数值与isLongPress在两种场景下的正确性。4. modifiers事件修饰符onLongPress复用了类似 Vue 指令修饰符的语义可用修饰符如下ModifierDescriptionstopCallsevent.stopPropagation()onceRemoves event listener after first triggerpreventCallsevent.preventDefault()captureUses capture mode for event listenerselfOnly trigger if target is the element itselfonLongPress(target, handler, { modifiers: { prevent: true, stop: true, }, })修饰符的底层实现分布在三个环节index.tsprevent/stop在onDown、onMove、onRelease中分别调用preventDefault()与stopPropagation()例如按住时阻止页面滚动、文本选择等默认行为。capture/once直接透传给底层事件监听构成AddEventListenerOptions的capture与once字段。self在onDown/onMove/onRelease中都校验ev.target elementRef.value从而只有点击元素本身而非其子元素时才生效。测试中的佐证workOnceAndPreventModifiersindex.test.ts验证once prevent组合下回调只触发一次且defaultPrevented truestopPropagationL83-L95验证stop修饰符阻止事件冒泡到父元素notTriggerCallbackOnChildLongPressL56-L65验证self修饰符下按住子元素不触发回调。三、内部实现原理事件流与状态机onLongPress的实现非常精简核心是按下计时 移动取消 释放回调三步状态机packages/core/onLongPress/index.tspointerdownonDown记录按下点posStart { x: ev.x, y: ev.y }与时间戳startTimestamp ev.timeStamp然后用setTimeout(..., getDelay(ev))启动长按计时器。pointermoveonMove只要未超出distanceThreshold就保持计时一旦超出则clear()取消。pointerup/pointerleave/pointercancelonRelease先快照并清除状态再调用onMouseUp若提供。事件监听通过 useEventListener 挂载stop返回函数会对四个监听器逐一执行清理index.ts。三个值得注意的实现细节长按回调在setTimeout中执行时传递的是按下时的原始 PointerEventonDown闭包捕获的ev而不是移动或抬起时的事件。状态变量posStart、startTimestamp、hasLongPressed每次按下都会先被clear()重置因此重复按下互不干扰测试triggerCallbackWithDelay正是验证了第一次按住 500ms 后抬起不触发第二次按住满 1000ms 触发一次。pointercancel也走onRelease因此浏览器接管手势例如第二个手指开始捏合缩放时会取消长按测试 notTriggerCallbackOnPointerCancel 验证了这一点。四、组件用法OnLongPress除了 HookVueUse 还提供了渲染组件OnLongPress从vueuse/components导入适合在模板中声明式使用script setup langts import { OnLongPress } from vueuse/components import { shallowRef } from vue const longPressedComponent shallowRef(false) function onLongPressCallbackComponent(e: PointerEvent) { longPressedComponent.value true } function resetComponent() { longPressedComponent.value false } /script template pLong Pressed: {{ longPressedComponent }}/p OnLongPress asbutton classml-2 button small triggeronLongPressCallbackComponent Press long /OnLongPress button classml-2 button small clickresetComponent Reset /button /template组件机制见 packages/core/onLongPress/component.ts通过as属性指定渲染标签默认div类型来自RenderableComponent见 packages/core/types.ts。通过options属性透传全部OnLongPressOptions。长按触发时 emittrigger事件携带原生 PointerEvent。组件内部用shallowRef持有渲染根节点作为监听目标默认插槽会注入useOnLongPressReturn数据方便在插槽内读取 stop 函数等。五、指令用法vOnLongPressvOnLongPress指令同样从vueuse/components导入提供最简洁的模板语法两种绑定形式script setup langts import { vOnLongPress } from vueuse/components import { shallowRef } from vue const longPressedDirective shallowRef(false) function onLongPressCallbackDirective(e: PointerEvent) { longPressedDirective.value true } function resetDirective() { longPressedDirective.value false } /script template pLong Pressed: {{ longPressedDirective }}/p !-- 使用 .prevent 修饰符 -- button v-on-long-press.preventonLongPressCallbackDirective classml-2 button small Press long /button !-- 使用数组形式传入回调与选项 -- button v-on-long-press[onLongPressCallbackDirective, { delay: 1000, modifiers: { stop: true } }] classml-2 button small Press long (with options) /button button classml-2 button small clickresetDirective Reset /button /template指令实现见 packages/core/onLongPress/directive.ts基于createDisposableDirective绑定的值若为函数则直接作为 handler并把模板上的指令修饰符.prevent、.stop等作为modifiers传入若为[handler, options]数组则同时展开回调与完整OnLongPressOptions指令在mounted时注册监听组件卸载时由createDisposableDirective自动清理监听器。指令测试见 directive.test.ts无选项时按住 500ms 触发一次传入delay: 1000时按住 500ms 不触发、满 1000ms 触发卸载后pointerdown不再触发回调。六、三种用法的选型建议与注意事项场景推荐用法理由逻辑密集、需与响应式状态联动、动态控制监听开关HookonLongPress可编程、返回 stop 函数、参数全部可配置模板优先、希望以组件语义声明交互组件OnLongPress声明式、可自定义渲染标签、事件驱动追求最简模板、复用原生指令修饰符习惯指令vOnLongPress一行绑定、自动清理、支持.prevent等修饰符实操注意事项长按与浏览器默认行为的冲突如长按触发系统菜单、选中文本、滚动可通过prevent: true或stop: true修饰符缓解必要时结合 CSSuser-select: none。distanceThreshold的默认 10px 对触屏用户可能偏小可按需调大如 20~24px仓库 demo 即使用 24px 与 1000ms 组合演示长按或点击场景demo.vue。delay作为函数时基于事件动态求值可用于区分pointerTypemouse | touch | pen见 types.ts兼顾不同输入设备的操作习惯。函数式用法的返回 stop 函数请在组件卸载时调用以释放监听组件与指令用法则由 VueUse 自动完成清理。七、源码结构与快速上手路径onLongPress相关文件全部位于 packages/core/onLongPress/ 目录文件作用index.tsHook 核心实现与全部类型声明component.tsOnLongPress渲染组件directive.tsvOnLongPress指令index.test.tsHook 的完整行为测试9 个用例directive.test.ts指令的挂载、触发与卸载清理测试demo.vue演示不同 delay / 阈值 / onMouseUp 组合的交互示例index.md官方文档本仓库 skills/vueuse-functions/references/onLongPress.md 的知识来源从入口看vueuse/core通过 packages/core/index.ts 的export * from ./onLongPress导出 Hookpackages/components/index.ts 同时导出组件与指令因此三条使用路径分别对应vueuse/core与vueuse/components两个包的导入。从源码结构看onLongPress 不依赖任何浏览器专属 API 的 polyfill仅依赖 Pointer Events 与setTimeout实现轻盈、可测试性高非常适合作为学习 VueUse 组合式工具实现风格的入门范本。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse onLongPress 完整指南Vue 3 长按交互的侦听、配置与组件/指令用法VueUse onLongPress 完整指南Vue 3 长按交互的侦听、配置与组件/指令用法 onLongPress 是 VueUse 为 Vue 3 提供前端VueUse 的 useElementOverflow响应式检测元素溢出状态组合式、组件与指令三种用法全解析VueUse 的 useElementOverflow响应式检测元素溢出状态组合式、组件与指令三种用法全解析 useElementOverflow 是 V前端VueUse 的 useIntersectionObserver 全面指南元素可见性检测、响应式监听与指令用法VueUse 的 useIntersectionObserver 全面指南元素可见性检测、响应式监听与指令用法 导读 useIntersectionObser前端上一篇DevOps事件管理工具GitHub_Trending/aw/awesome-devops平台事件响应平台下一篇tsParticles Export JSON 插件实战把粒子配置一键导出为 JSON 文件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MRAM掉电保护实战:MR25H40CDF与PIC24微控制器SPI接口设计

MRAM掉电保护实战:MR25H40CDF与PIC24微控制器SPI接口设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:49:20 阅读更多 →
网盘直链下载助手:3步跑通9大网盘真实直链获取

网盘直链下载助手:3步跑通9大网盘真实直链获取

网盘直链下载助手:3步跑通9大网盘真实直链获取 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / …

2026/10/5 1:48:20 阅读更多 →
嵌入式字库解耦实战:基于SD卡灌SPI Flash的LCD显示方案

嵌入式字库解耦实战:基于SD卡灌SPI Flash的LCD显示方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:48:20 阅读更多 →

最新新闻

【关注可白嫖源码】--课程设计+毕业设计+76444基于SpringBoot的心理健康自助咨询平台设计与实现

【关注可白嫖源码】--课程设计+毕业设计+76444基于SpringBoot的心理健康自助咨询平台设计与实现

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一一回复站内私信,发送完整文件摘 要当前社…

2026/10/5 2:25:36 阅读更多 →
【含视频】官方WorkBuddy应用师认证教程05 安 全 与 合 规

【含视频】官方WorkBuddy应用师认证教程05 安 全 与 合 规

对应视频: WorkBuddy应用师认证教程05安全与合规01使用决策-CSDN直播 WorkBuddy应用师认证教程05安全与合规02权限边界-CSDN直播 WorkBuddy应用师认证教程05安全与合规03输出验证-CSDN直播 WorkBuddy应用师认证教程05安全与合规04防线配置-CSDN直播 第 五 章 安…

2026/10/5 2:25:36 阅读更多 →
数据缩放(Feature Scaling)旨在将特征值映射到统一范围,避免大数值特征主导模型训练,提升收敛速度与预测精度

数据缩放(Feature Scaling)旨在将特征值映射到统一范围,避免大数值特征主导模型训练,提升收敛速度与预测精度

在 Python 编程生态中,“Scale” 是一个高频多义词。它既可以指代数据预处理中的特征缩放,也可以是 Matplotlib 中的坐标轴刻度,还能是 Tkinter 中的滑块控件,甚至涉及大模型时代的 Scaling Laws。理解不同语境下的 Scale&#xf…

2026/10/5 2:25:36 阅读更多 →
STM32+MAX6675+K型热电偶高温测温方案详解:原理、接线与代码

STM32+MAX6675+K型热电偶高温测温方案详解:原理、接线与代码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 2:25:36 阅读更多 →
OBCA V4.0课后习题整理

OBCA V4.0课后习题整理

第一章 OceanBase 概述 【判断题】OceanBase 是 100% 自研的国产数据库,不是基于开源产品的再次开发。(√)【判断题】OceanBase 是全球唯一一个同时刷新了 TPCC 和 TPCH 世界纪录的数据库。(√)【判断题】OceanBase 是…

2026/10/5 2:25:36 阅读更多 →
AI前沿 | 2026年9月21日:Step 5 大模型来了 + 600B 稀疏 MoE 架构 + 1/8 成本 API

AI前沿 | 2026年9月21日:Step 5 大模型来了 + 600B 稀疏 MoE 架构 + 1/8 成本 API

AI前沿 | 2026年9月21日:Step 5 大模型来了 600B 稀疏 MoE 架构 1/8 成本 API 📖 首屏导读 本教程配套付费专栏:《大模型工程师修炼手记》 19.9 元(AI 编程 Agent 实战 本文同主题系统课程) 《AI时代程序员的自我…

2026/10/5 2:24:36 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →