当前位置:首页 > VUE

vue 实现长按删除

2026-02-18 15:09:07VUE

实现长按删除功能

在Vue中实现长按删除功能,可以通过监听touchstarttouchend事件,结合定时器来实现。以下是一个完整的实现方案:

监听触摸事件

在需要长按删除的元素上绑定touchstarttouchend事件。touchstart事件用于启动计时器,touchend事件用于取消计时器。

<template>
  <div 
    @touchstart="startPress"
    @touchend="endPress"
  >
    长按我删除
  </div>
</template>

设置计时器

startPress方法中设置一个计时器,延迟执行删除操作。通常长按的时间阈值设置为500ms到1s。

<script>
export default {
  data() {
    return {
      pressTimer: null
    }
  },
  methods: {
    startPress() {
      this.pressTimer = setTimeout(() => {
        this.deleteItem()
      }, 1000) // 1秒后触发删除
    },
    endPress() {
      clearTimeout(this.pressTimer)
    },
    deleteItem() {
      // 执行删除逻辑
      console.log('删除操作')
    }
  }
}
</script>

添加视觉反馈

为了提高用户体验,可以在长按时添加视觉反馈,比如改变背景色或显示提示。

<template>
  <div 
    @touchstart="startPress"
    @touchend="endPress"
    :class="{ 'active': isPressing }"
  >
    长按我删除
  </div>
</template>
<script>
export default {
  data() {
    return {
      pressTimer: null,
      isPressing: false
    }
  },
  methods: {
    startPress() {
      this.isPressing = true
      this.pressTimer = setTimeout(() => {
        this.deleteItem()
      }, 1000)
    },
    endPress() {
      this.isPressing = false
      clearTimeout(this.pressTimer)
    }
  }
}
</script>

兼容鼠标事件

如果需要同时支持鼠标操作,可以添加mousedownmouseup事件。

<template>
  <div 
    @touchstart="startPress"
    @touchend="endPress"
    @mousedown="startPress"
    @mouseup="endPress"
    @mouseleave="endPress"
  >
    长按我删除
  </div>
</template>

防止误触

为了避免误触,可以在touchend时检查手指移动距离,如果移动过大则取消删除操作。

methods: {
  startPress(e) {
    this.startX = e.touches ? e.touches[0].clientX : e.clientX
    this.startY = e.touches ? e.touches[0].clientY : e.clientY
    this.isPressing = true
    this.pressTimer = setTimeout(() => {
      this.deleteItem()
    }, 1000)
  },
  endPress(e) {
    const endX = e.changedTouches ? e.changedTouches[0].clientX : e.clientX
    const endY = e.changedTouches ? e.changedTouches[0].clientY : e.clientY
    const distance = Math.sqrt(Math.pow(endX - this.startX, 2) + Math.pow(endY - this.startY, 2))
    if (distance > 10) {
      clearTimeout(this.pressTimer)
    }
    this.isPressing = false
  }
}

完整示例

以下是一个完整的Vue组件示例:

vue 实现长按删除

<template>
  <div 
    @touchstart="startPress"
    @touchend="endPress"
    @mousedown="startPress"
    @mouseup="endPress"
    @mouseleave="endPress"
    :class="{ 'active': isPressing }"
    class="long-press-item"
  >
    长按我删除
  </div>
</template>

<script>
export default {
  data() {
    return {
      pressTimer: null,
      isPressing: false,
      startX: 0,
      startY: 0
    }
  },
  methods: {
    startPress(e) {
      this.startX = e.touches ? e.touches[0].clientX : e.clientX
      this.startY = e.touches ? e.touches[0].clientY : e.clientY
      this.isPressing = true
      this.pressTimer = setTimeout(() => {
        this.deleteItem()
      }, 1000)
    },
    endPress(e) {
      const endX = e.changedTouches ? e.changedTouches[0].clientX : e.clientX
      const endY = e.changedTouches ? e.changedTouches[0].clientY : e.clientY
      const distance = Math.sqrt(Math.pow(endX - this.startX, 2) + Math.pow(endY - this.startY, 2))
      if (distance > 10) {
        clearTimeout(this.pressTimer)
      }
      this.isPressing = false
    },
    deleteItem() {
      alert('删除成功')
    }
  }
}
</script>

<style>
.long-press-item {
  padding: 20px;
  background: #f0f0f0;
  margin: 20px;
}
.long-press-item.active {
  background: #ffeb3b;
}
</style>

通过以上方法,可以在Vue中实现一个完整的长按删除功能,包括触摸和鼠标支持、视觉反馈以及防误触处理。

标签: vue
分享给朋友:

相关文章

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue 实现注册

vue 实现注册

Vue 实现注册功能 注册功能通常包括表单验证、数据提交和用户反馈。以下是实现注册功能的步骤: 1. 创建注册表单组件 在 Vue 项目中创建一个注册表单组件,包含用户名、邮箱、密码等输入字段。…

vue实现购票

vue实现购票

Vue 实现购票功能 数据结构设计 购票功能通常需要以下数据结构: 场次信息(时间、地点、价格) 座位信息(可选座位、已售座位) 用户订单信息 示例数据结构: data() { return…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

vue实现tip

vue实现tip

Vue实现Tooltip的方法 使用Vue实现Tooltip可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML的title属性 在Vue模板中直接使用HTML的title属性是最简单的实…