当前位置:首页 > VUE

vue 实现长按删除

2026-01-17 22:41:12VUE

实现长按删除功能

在Vue中实现长按删除功能可以通过监听touchstarttouchend事件,或者mousedownmouseup事件来实现。以下是具体实现方法:

方法一:使用事件监听

vue 实现长按删除

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

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

方法二:使用自定义指令

可以创建一个自定义指令v-longpress来复用长按逻辑:

vue 实现长按删除

// 注册全局指令
Vue.directive('longpress', {
  bind: function(el, binding) {
    let pressTimer = null

    const start = (e) => {
      if (pressTimer === null) {
        pressTimer = setTimeout(() => {
          binding.value()
        }, 1000)
      }
    }

    const cancel = () => {
      if (pressTimer !== null) {
        clearTimeout(pressTimer)
        pressTimer = null
      }
    }

    el.addEventListener('mousedown', start)
    el.addEventListener('touchstart', start)
    el.addEventListener('mouseup', cancel)
    el.addEventListener('mouseleave', cancel)
    el.addEventListener('touchend', cancel)
  }
})

// 使用指令
<template>
  <button v-longpress="deleteItem">长按删除</button>
</template>

<script>
export default {
  methods: {
    deleteItem() {
      // 删除逻辑
    }
  }
}
</script>

注意事项

  1. 移动端和PC端需要同时处理touchmouse事件
  2. 清除定时器时要确保所有可能的事件都处理了(如mouseleave
  3. 长按时间可以根据需求调整,通常1-2秒比较合适
  4. 可以考虑添加触觉反馈(如震动)提升用户体验

优化版本

<template>
  <div 
    @mousedown="startPress"
    @mouseup="cancelPress"
    @mouseleave="cancelPress"
    @touchstart="startPress"
    @touchend="cancelPress"
    @touchcancel="cancelPress"
  >
    {{ pressProgress }}%
  </div>
</template>

<script>
export default {
  data() {
    return {
      pressTimer: null,
      pressStartTime: 0,
      pressProgress: 0
    }
  },
  methods: {
    startPress() {
      this.pressStartTime = Date.now()
      this.pressTimer = setInterval(() => {
        const elapsed = Date.now() - this.pressStartTime
        this.pressProgress = Math.min(Math.floor(elapsed / 10), 100)
        if (elapsed >= 1000) {
          this.deleteItem()
          this.cancelPress()
        }
      }, 16)
    },
    cancelPress() {
      clearInterval(this.pressTimer)
      this.pressProgress = 0
    },
    deleteItem() {
      // 删除逻辑
    }
  }
}
</script>

这个优化版本添加了进度显示功能,让用户能看到长按的进度,提升交互体验。

标签: vue
分享给朋友:

相关文章

vue实现多人视频

vue实现多人视频

实现多人视频通话的Vue方案 使用WebRTC技术结合Vue框架可以构建多人视频通话应用。以下是核心实现方法: 技术栈选择 Vue 2/3作为前端框架 WebRTC用于实时通信 Socket.io…

vue实现多层评论回复

vue实现多层评论回复

Vue 实现多层评论回复 数据结构设计 多层评论通常采用嵌套结构,每个评论对象包含子评论数组。示例数据结构如下: comments: [ { id: 1, content: '…

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mi…

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…