vue3中,拦截双击事件的第一次点击,写一些逻辑
在 Vue 3 中,如果想要拦截双击事件的第一次点击并执行一些逻辑,你可以使用一个状态变量来跟踪第一次点击事件,并在第二次点击时阻止第一次点击逻辑的执行。以下是一个实现示例:
<template>
<div
@mousedown="handleMouseDown"
@dblclick="handleDoubleClick"
>
双击这个区域
</div>
</template>
<script setup>
import { ref } from 'vue';
// 定义一个变量来跟踪第一次点击事件是否在冷却期内
const isCoolingDown = ref(false);
function handleMouseDown(event) {
// 如果不在冷却期内,执行第一次点击的逻辑
if (!isCoolingDown.value) {
console.log('第一次点击逻辑');
// 设置冷却期状态为 true,并在一定时间后重置为 false
isCoolingDown.value = true;
setTimeout(() => {
isCoolingDown.value = false;
}, 300); // 300ms 是双击间隔时间,可以根据实际情况调整
}
}
function handleDoubleClick(event) {
// 如果处于冷却期内,阻止默认的双击事件行为
if (isCoolingDown.value) {
event.preventDefault();
event.stopPropagation();
console.log('拦截了第一次点击,执行双击逻辑');
} else {
// 如果不在冷却期内,执行正常的双击逻辑
console.log('执行正常的双击逻辑');
}
}
</script>
在这个示例中:
- 我们使用
ref
来定义isCoolingDown
状态变量。 handleMouseDown
方法用于处理鼠标按下(第一次点击)事件。如果isCoolingDown
为false
,则执行第一次点击的逻辑,并设置一个300毫秒的冷却期。handleDoubleClick
方法用于处理双击事件。如果isCoolingDown
为true
,则表示第一次点击逻辑正在冷却期内,我们阻止默认的双击行为并执行自定义的双击逻辑。如果isCoolingDown
为false
,则执行正常的双击逻辑。
这种方法可以确保在双击事件的第一次点击时执行特定的逻辑,同时在第二次点击时执行另一组逻辑或阻止默认的双击行为。
开发案例:
const isFlag = ref(false);
function handleMouseDown() {
console.log('handleMouseDown');
if (!isFlag.value) {
console.log('第一次点击');
isFlag.value = true;
// console.log('isFlag.value-1', isFlag.value);
setTimeout(() => {
isFlag.value = false;
// console.log('isFlag.value-2', isFlag.value);
}, 300);
}
}
function rowClick(event, field) {
console.log('event', event, 'field', field);
if (isFlag.value) {
event.preventDefault();
event.stopPropagation();
console.log('拦截了第一次点击,并执行双击逻辑');
} else {
console.log('执行双击逻辑');
}
// 以下是双击的逻辑
field.Selected = true;
props.rowClickCB(
event,
Object.assign(new Cell(), { TableField: field, TableInfo: props.TableInfo })
);
}
<div
:class="item.Selected ? 'row' : ''"
@contextmenu.prevent="fieldMenu($event, TableInfo, item)"
@click="selectField(activeList, item, startNum + index)"
@dblclick="rowClick($event, item)"
@mousedown="handleMouseDown"
style="display: flex; justify-content: space-around"
>
开发案例中,到目前为止,可以成功拦截第一次点击,但是需要注意的是,需要双击的频率在合适(双击频率要在300ms内点击第二次)的情况下才会拦截第一次点击,在里面写你要的TODO逻辑即可。(如果双击频率稳定在某个范围(凭感觉),就会走到else {console.log('执行双击逻辑');}),所以双击逻辑放到 if 外面就能都走到,目的是拦截第一次点击做一些操作而已。
如果需要每次双击都拦截到第一次点击,可以调一下定时器的时间即可,可以调到500ms,一般人双击的频率都可以在500ms点击第二次。但是超过500ms之后点击第二次的话也不会拦截到第一次点击。
原文地址:https://blog.csdn.net/weixin_48420104/article/details/142845682
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!