vue实现长按
Vue 实现长按功能的方法
在 Vue 中实现长按功能可以通过监听 mousedown 和 touchstart 事件来开始计时,并在达到指定时间后触发长按事件。以下是几种实现方式:
使用自定义指令
自定义指令可以封装长按逻辑,方便在多个组件中复用。
Vue.directive('longpress', {
bind: function (el, binding, vNode) {
let pressTimer = null
const handler = binding.value
const start = (e) => {
if (pressTimer === null) {
pressTimer = setTimeout(() => {
handler()
}, 1000) // 1秒长按
}
}
const cancel = () => {
if (pressTimer !== null) {
clearTimeout(pressTimer)
pressTimer = null
}
}
el.addEventListener('mousedown', start)
el.addEventListener('touchstart', start)
el.addEventListener('mouseup', cancel)
el.addEventListener('mouseleave', cancel)
el.addEventListener('touchend', cancel)
el.addEventListener('touchcancel', cancel)
}
})
使用方式:

<button v-longpress="longPressHandler">长按我</button>
使用组件方法
在组件内部直接实现长按逻辑。
export default {
methods: {
startPress(e) {
this.pressTimer = setTimeout(() => {
this.longPressHandler()
}, 1000)
},
endPress() {
clearTimeout(this.pressTimer)
},
longPressHandler() {
console.log('长按事件触发')
}
}
}
模板部分:

<button
@mousedown="startPress"
@touchstart="startPress"
@mouseup="endPress"
@touchend="endPress"
>长按我</button>
使用第三方库
可以使用 vue-touch 或 hammer.js 等库来简化长按功能的实现。
安装 hammer.js:
npm install hammerjs
使用示例:
import Hammer from 'hammerjs'
export default {
mounted() {
const hammer = new Hammer(this.$el)
hammer.on('press', () => {
console.log('长按事件触发')
})
}
}
注意事项
- 移动端需要同时处理
touchstart和touchend事件。 - 长按时间可以根据需求调整,通常设置为 500ms 到 1s。
- 清除定时器时要确保所有可能取消长按的事件都被处理。
以上方法可以根据项目需求选择适合的实现方式。自定义指令适合全局复用,组件方法适合局部使用,第三方库则提供了更丰富的手势支持。






