Vue全局事件防止重复点击(等待请求)【进阶版】

《Vue全局指令防止重复点击(等待请求)》之后,感觉指令方式还是不太友好,而且嵌套闭包比较麻烦,于是想到了Vue的全局混入,利用混入,给组件绑定click事件。

一、实现原理

与指令方式大致一样,只不过事件方式则是利用组件的事件监听属性完成绑定,这种方式更加友好、简洁、易懂。

二、使用

html 复制代码
<el-button type="primary" icon="el-icon-search" size="mini" @conClick="handleQuery">搜索</el-button>

三、注意事项

1. 同步和异步回调

当前方式同样支持同步和异步回调,且异步回调需闭包

同步:

js 复制代码
handleQuery() {
  this.queryParams.pageNum = 1;
  await this.getList();
}

异步回调:

js 复制代码
handleQuery() {
  return (removeDisabled) => {
    // 去掉组件禁用
    removeDisabled();
  }
}

四、代码

js 复制代码
import Vue from 'vue'

Vue.mixin({
  mounted() {
    // 获取组件所有的监听事件,判断有没有conClick
    if (this.$listeners && this.$listeners.conClick && this.$listeners.conClick instanceof Function) {
      // 如果有的话给对应的DOM添加click监听
      const el = this.$el;
      el.addEventListener('click', async (e) => {
        // 自定义点击开始DOM状态
        let hasCb = false;
        el.classList.add('is-disabled');
        el.disabled = true;

        // 执行组件绑定的事件
        const res = await this.$listeners.conClick();
        if (res instanceof Function) {
          // 如果获取的结果为方法,则为异步回调
          hasCb = true;
          const d = res(() => {
            el.disabled = false;
            el.classList.remove('is-disabled');
          })
          if (!(d instanceof Promise)) {
            hasCb = true;
          } else {
            await d;
          }
        }

        // 自定义点击结束DOM状态
        if (!hasCb) {
          el.disabled = false;
          el.classList.remove('is-disabled');
        }
      });
    }
  }
})
相关推荐
超哥--8 小时前
B站视频内容智能分析系统(九):React 前端与管理面板
前端·react.js·前端框架
Cutecat_11 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
dsyyyyy110111 小时前
JavaScript变量
开发语言·javascript·ecmascript
qq_4221525711 小时前
PDF 加水印工具怎么选?2026 年文档版权保护方案对比
前端·pdf·github
kyriewen11 小时前
手写 Promise.all、race、any:不到 30 行代码,解决并发异步的所有姿势
前端·javascript·面试
brucelee18612 小时前
OpenClaw 浏览器控制(Chrome MCP)完整教程
前端·chrome
ct97813 小时前
React 状态管理方案深度对比
开发语言·前端·react
胡志辉的博客13 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·chrome·chromium·event loop
代码不加糖13 小时前
js中不会冒泡的事件有哪些?
前端·javascript·vue.js
懂懂tty13 小时前
Vue2与Vue3之间API差异
前端·javascript·vue.js