Skip to content

v-long-press

检测元素上的长按手势。

起始版本: 1.1.0

用法

基本

vue
<template>
  <button v-long-press="handleLongPress">长按我</button>
</template>

<script setup>
function handleLongPress(event) {
  console.log('长按触发!')
}
</script>

带选项

vue
<template>
  <button v-long-press="{
    handler: handleLongPress,
    duration: 1000,
    onStart: handleStart,
    onCancel: handleCancel
  }">
    1秒长按
  </button>
</template>

Composable 用法

你也可以使用 useLongPress composable 来实现相同功能:

vue
<script setup>
import { ref, onMounted } from 'vue'
import { useLongPress } from 'directix'

const buttonRef = ref(null)
const { isPressing, bind } = useLongPress({
  onTrigger: (event) => {
    console.log('长按触发!')
  },
  duration: 800,
  onStart: (event) => console.log('开始按压'),
  onCancel: (event) => console.log('取消按压')
})

onMounted(() => {
  const unbind = bind(buttonRef.value)
  onUnmounted(unbind)
})
</script>

<template>
  <button ref="buttonRef">长按我</button>
</template>

API

typescript
interface UseLongPressOptions {
  /** 触发长按的持续时间(毫秒) */
  duration?: number | Ref<number>
  /** 取消前的最大移动距离 */
  distance?: number | Ref<number>
  /** 按下开始时的回调 */
  onStart?: (event: MouseEvent | TouchEvent) => void
  /** 长按触发时的回调 */
  onTrigger?: (event: MouseEvent | TouchEvent) => void
  /** 取消按压时的回调 */
  onCancel?: (event: MouseEvent | TouchEvent) => void
  /** 长按过程中每个 tick 的回调 */
  onTick?: (remaining: number) => void
  /** tick 间隔(毫秒) */
  tickInterval?: number
  /** 是否阻止默认行为 */
  prevent?: boolean
}

interface UseLongPressReturn {
  /** 是否正在按压 */
  isPressing: Readonly<Ref<boolean>>
  /** 开始长按检测 */
  start: (event: MouseEvent | TouchEvent) => void
  /** 停止长按检测 */
  stop: (event: MouseEvent | TouchEvent) => void
  /** 绑定事件到元素 */
  bind: (element: HTMLElement) => () => void
}

基于 MIT 许可发布