解决@tap与@longtap同时触发的问题

1,275 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

因为之前使用uni-app做备考小程序时需要有一个功能:点击可以发送一次请求获取数据并渲染到页面中,长按可以清除获取到的数据。自认为很简单于是便直接着手开始制作,但是在绑定@tap与@longtap时遇到了问题——点击时只会触发tap所绑定的函数,但是长按时tap与longtap同时触发了。解决方案是加一个限制以达到长按时不允许tap触发

大致思路

现在的html结构如下

屏幕截图 2022-07-30 171208.png

<view class="sentence text-center fontS28"
@tap="getSentence" @longtap="noSentence" @touchend="touchend">
	<text>{{obj.sentence.hitokoto}}{{obj.sentence.from}}</text>
	<view class="fontS24">
		点击以获取一条句子,长按以取消
	</view>
</view>

要想达到限制tap所绑定的函数不触发,则需要一个锁来锁住tap,于是我们在data中定义一个lock默认为false,而且需要在tap所绑定的函数中添加一个 if 判断,于是有

data

data() {
	return {
		lock: false,
	}
},

methods中添加如下三个函数

getSentence() {
	if (!this.lock) {
            //你的别的代码
        }
},

上面这段对于我需要的功能而言是用来单机时请求数据的

上面的这一段代码很简单,就是一个 if 判断,里面包着需要的内容

noSentence() {
	this.lock = true
	//你的别的代码
}

上面这段对于我需要的功能而言是用来长按时清除数据的

因此长按时对data中的lock修改值为true,代表上锁

touchend() {
	setTimeout(() => {
		this.lock = false
	})
},

上述这段代码是当touched事件触发时调用的,使用setTimeout的原因我具体也不太清楚,我估计是利用定时器,将定时器内的用于解锁的代码加入队列中使其延迟到tap事件结束后执行,亲测去掉这一段无法实现锁与解锁功能

@tap、@longtap、@touched的触发顺序

@tap: 所绑定函数在点击后离开时触发

@longtap: 所绑定函数在用户长按屏幕350ms后触发,文档上说如果指定了@tap事件,则@tap事件不会触发,但是我自己使用时仍需要自己写一个锁来限制

@touched: 所绑定函数在触摸事件结束后触发

三者触发顺序:

屏幕截图 2022-07-31 232956.png