vue实现tap事件
实现 Vue 中的 Tap 事件
在 Vue 中实现类似移动端的 Tap 事件,可以通过以下几种方式:
自定义指令实现
注册一个全局自定义指令 v-tap,用于处理轻触事件:
Vue.directive('tap', {
bind(el, binding) {
let startX, startY
el.addEventListener('touchstart', (e) => {
startX = e.touches[0].clientX
startY = e.touches[0].clientY
})
el.addEventListener('touchend', (e) => {
const endX = e.changedTouches[0].clientX
const endY = e.changedTouches[0].clientY
if (Math.abs(endX - startX) < 10 && Math.abs(endY - startY) < 10) {
binding.value(e)
}
})
}
})
使用方式:

<button v-tap="handleTap">点击我</button>
使用第三方库
安装 vue-touch 库:
npm install vue-touch@next
在 Vue 项目中注册插件:

import Vue from 'vue'
import VueTouch from 'vue-touch'
Vue.use(VueTouch, {name: 'v-touch'})
使用方式:
<v-touch @tap="handleTap">
<div>点击区域</div>
</v-touch>
封装 Tap 组件
创建一个可复用的 Tap 组件:
Vue.component('tap', {
template: `
<div @touchstart="handleTouchStart"
@touchend="handleTouchEnd"
@click="handleClick">
<slot></slot>
</div>
`,
data() {
return {
startX: 0,
startY: 0
}
},
methods: {
handleTouchStart(e) {
this.startX = e.touches[0].clientX
this.startY = e.touches[0].clientY
},
handleTouchEnd(e) {
const endX = e.changedTouches[0].clientX
const endY = e.changedTouches[0].clientY
if (Math.abs(endX - this.startX) < 10 && Math.abs(endY - this.startY) < 10) {
this.$emit('tap', e)
}
},
handleClick(e) {
this.$emit('tap', e)
}
}
})
使用方式:
<tap @tap="handleTap">
<div>点击区域</div>
</tap>
注意事项
- 移动端建议使用
touch事件而非click事件,因为click有 300ms 延迟 - 判断轻触时建议设置合理的阈值(如 10px)以区分滑动和轻触
- PC 端需要兼容时,可以同时监听
click事件 - 注意事件冒泡和默认行为的处理






