当前位置:首页 > VUE

vue中实现长按事件

2026-02-21 03:17:53VUE

实现长按事件的方法

在Vue中实现长按事件可以通过原生JavaScript事件监听或自定义指令完成。以下是两种常见方法:

使用原生事件监听

在Vue组件的方法中通过mousedownmouseup事件配合定时器实现:

export default {
  methods: {
    startPress(e) {
      this.longPressTimer = setTimeout(() => {
        // 长按触发逻辑
        console.log('长按事件触发');
      }, 1000); // 1秒触发长按
    },
    cancelPress() {
      clearTimeout(this.longPressTimer);
    }
  },
  mounted() {
    const button = document.getElementById('longPressButton');
    button.addEventListener('mousedown', this.startPress);
    button.addEventListener('mouseup', this.cancelPress);
    button.addEventListener('mouseleave', this.cancelPress); // 防止移出元素后仍触发
  },
  beforeDestroy() {
    const button = document.getElementById('longPressButton');
    button.removeEventListener('mousedown', this.startPress);
    button.removeEventListener('mouseup', this.cancelPress);
  }
}

使用自定义指令

创建可复用的v-longpress指令更符合Vue的生态:

vue中实现长按事件

Vue.directive('longpress', {
  bind: function(el, binding) {
    let pressTimer = null;

    const start = (e) => {
      if (pressTimer === null) {
        pressTimer = setTimeout(() => {
          binding.value(); // 执行绑定函数
        }, 1000); // 1秒触发
      }
    };

    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);
  }
});

使用方式:

<button v-longpress="handleLongPress">长按我</button>

移动端适配注意事项

对于移动端需同时监听touchstarttouchend事件:

vue中实现长按事件

el.addEventListener('touchstart', start);
el.addEventListener('touchend', cancel);

性能优化建议

避免频繁创建定时器,在指令的unbind钩子中移除事件监听:

unbind(el) {
  el.removeEventListener('mousedown', start);
  // 移除其他事件监听...
}

参数配置扩展

可通过指令参数配置长按时间阈值:

Vue.directive('longpress', {
  bind(el, binding) {
    const delay = binding.arg || 1000; // 默认1秒
    // ...使用delay替代固定值
  }
});

使用带参数版本:

<button v-longpress:2000="handleLongPress">2秒长按触发</button>

标签: 事件vue
分享给朋友:

相关文章

vue插件实现

vue插件实现

Vue 插件实现方法 Vue 插件是一种向 Vue 应用程序添加全局功能的机制。插件可以包含全局指令、过滤器、混入、实例方法等。 插件的基本结构 一个 Vue 插件通常是一个对象或函数,需要暴露一个…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: npm i…

vue实现导出excel实现流程

vue实现导出excel实现流程

安装依赖库 需要安装 xlsx 和 file-saver 库来处理 Excel 文件的生成和保存。通过 npm 或 yarn 安装: npm install xlsx file-saver # 或…

vue实现的setdata

vue实现的setdata

Vue 中实现类似小程序 setData 的方法 在小程序中,setData 方法用于异步更新页面数据并触发视图渲染。Vue 中可以通过以下几种方式实现类似功能: 直接使用 Vue 的响应式系统 V…

vue实现数据联动

vue实现数据联动

Vue 数据联动实现方法 数据联动在 Vue 中通常指多个组件或数据项之间的动态关联更新。以下是几种常见实现方式: 使用 v-model 和计算属性 <template> <d…

vue实现反向推送

vue实现反向推送

Vue 实现反向推送的方法 反向推送通常指子组件向父组件传递数据或触发事件。在 Vue 中,可以通过以下几种方式实现反向推送。 使用 $emit 触发自定义事件 子组件通过 $emit 方法触发一个…