拖拽按钮: 如何区分点击和拖拽事件 (vueuse实现)

问题:使用vueuseuseDraggable去拽按钮时会触发点击事件,即使设置阻止默认事件还是没用。
在这里插入图片描述

方案1:判断拖拽时长

判断拖拽时长,如果大于点击的时间秒数,则被认为是拖拽。小于被认为是点击,则触发点击事件。
按钮点击时,也会触发onStartonEnd回调函数。
缺点:如果点击时按下鼠标很长时间后才松开,会被误认为拖拽(虽然没人点击按钮这么按,万一…), 所以第二种方式会更好些!!

<template>
  <!--左侧可折叠/展开菜单  -->
  <Transition>
    <div v-show="menuVisible" class="flex flex-column bg-white">
      <div class="menu-header" @click="() => menuVisible = false">
        <span class="header-title">{
  {  props.menuTitle}}</span>
        <el-tooltip effect="dark" :content="props.menuIconTip" :placement="props.menuIconTipPosition" :hide-after="50">
          <el-icon size="22" color="#333333bd"><DArrowLeft /></el-icon>
        </el-tooltip>
      </div>
      <slot name="menu"></slot>
    </div>
  </Transition>
  <!-- 可拖拽悬浮按钮 -->
  <div ref="el" class="btn-wrap" :style="style" style="position: fixed">
      <el-tooltip  effect="dark" :content="props.btnTip" :placement="props.btnTipPosition" :hide-after="100">
       <Transition>
        <div class="btn-block" v-show="!menuVisible">
          <slot name="btn">
            <img src="@/assets/images/menu.svg" class="w-25 h-25" />
          </slot>
        </div>
       </Transition>
      </el-tooltip>
    </div>
</template>
<script setup lang="ts">
import {
      useDraggable, useWindowSize,Position } from '@vueuse/core';

// 与这部分相关的逻辑代码
const el = ref<HTMLElement | null>(null);
const {
      width, height } = useWindowSize();
const startTime = ref(null);
const draggedTime = ref(0);

const {
      x, y, style } = useDraggable(el, {
     
  initialValue: {
      x: 125, y: height.value - 100 },
  preventDefault: true,// 默认为false时,拖拽按钮后松开鼠标后,按钮仍黏在光标上
  onMove: (position: Position) => {
     
    // 右边缘限制
    if (position.x > width.value - 60) {
     
      position.x = width.value - 60;
    }
    // 左边缘限制
    if (position.x < 99) {
     
      position.x = 99;
    }
    // 上边缘限制
    if (position.y < 160) {
     
      position.y = 160;
    }
    // 下边缘限制
    if (position.y > height.value - 75) {
     
      position.y = height.value - 75;
    }
  },
  onStart: () => {
     
    startTime.value = new Date();
  },
  onEnd: () => {
     
    const endTime = new Date();
    // 计算拖拽开始和结束的时间差秒数                                                                                                                                                                                                            
    const timeDiff = (endTime.getTime() - startTime.value.getTime()) / 1000;
    draggedTime.value = Number(timeDiff.toFixed(2));
    console.log(draggedTime.value, 'draggedTime');
    if (draggedTime.value < 0.15) {
     
      //点击后的事件
      menuVisible.value = true;
    }
  },
});
</script>

方案 2:onMove中判断

按钮只有在拖拽时才会触发onMove回调函数,触发改函数则表示在拖拽中。

<template>
<!-- 可拖拽悬浮按钮 -->
  <div ref="el" class="btn-wrap" :style="style" style="position: fixed">
    <el-tooltip
      :visible="btnTipVisible"
      effect="dark"
      :content="props.btnTip"
      :placement="props.btnTipPosition"
      :hide-after="100">
      <!-- 绑定点击事件 -->
      <div class="btn-block" v-show="!menuVisible" @click="handleBtnClick">
        <img src="@/assets/images/tree.svg" class="w-25 h-25" />
      </div>
    </el-tooltip>
  </div>
</template>
<script setup lang="ts">
  import {
      useDraggable, useWindowSize,Position } from '@vueuse/core';

// 与这部分相关的逻辑代码
const el = ref<HTMLElement | null>(null);
const {
      width, height } = useWindowSize();
  
const isDragging = ref(false);// 判断是否在拖拽
  
const {
      x, y, style } = useDraggable(el, {
     
  initialValue: {
      x: 125, y: height.value - 100 },
  preventDefault: true,
  onMove: (position: Position) => {
     
    isDragging.value = true;
    // 右边缘限制
    if (position.x > width.value - 60) {
     
      position.x = width.value - 60;
    }
    // 左边缘限制
    if (position.x < 99) {
     
      position.x = 99;
    }
    // 上边缘限制
    if (position.y < 160) {
     
      position.y = 160;
    }
    // 下边缘限制
    if (position.y > height.value - 75) {
     
      position.y = height.value - 75;
    }
  },
});
const handleBtnClick = (e) => {
     
  if (isDragging.value) {
     
    e.preventDefault();
    isDragging.value = false;
  } else {
     
    menuVisible.value = !menuVisible.value;
  }
};
</script>

相关推荐

  1. Slider重写 添加开始,结束以及事件

    2024-02-05 01:40:02       13 阅读
  2. React实践

    2024-02-05 01:40:02       44 阅读
  3. React实践

    2024-02-05 01:40:02       44 阅读
  4. React实践

    2024-02-05 01:40:02       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-05 01:40:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-05 01:40:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-05 01:40:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-05 01:40:02       18 阅读

热门阅读

  1. MySQL中SQL查询语句优化

    2024-02-05 01:40:02       35 阅读
  2. 开源协议介绍

    2024-02-05 01:40:02       36 阅读
  3. 【华为机试】2023年真题C卷(python)-字符串拼接

    2024-02-05 01:40:02       38 阅读
  4. Docker 大纲

    2024-02-05 01:40:02       29 阅读
  5. 【递归】 92. 反转链表 II

    2024-02-05 01:40:02       33 阅读
  6. h.264与h.263的区别

    2024-02-05 01:40:02       32 阅读
  7. C# 更改系统的屏保设置

    2024-02-05 01:40:02       32 阅读