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');
        }
      });
    }
  }
})
相关推荐
风骏时光牛马5 分钟前
AI提示词工程:高效构建精准指令的方法论
前端
YHHLAI11 分钟前
基于 Next.js 16 + Redis 的全栈笔记博客系统
javascript·redis·笔记
葡萄城技术团队14 分钟前
一个好的 BI Dashboard 到底应该怎么设计?
前端
晴天162 小时前
前端 postMessage 使用场景
前端·javascript·网络
zhanghaha13143 小时前
HTML系列教程:15_标签 全称 + 简写 超详细讲解(新手专用)
前端·html
zhanghaha13143 小时前
HTML系列教程:14_HTML 表单与输入框 <form>、<input> 零基础详解
java·前端·javascript
IMPYLH3 小时前
HTML 的 <samp> 元素
前端·网络·html
IMPYLH3 小时前
HTML 的 <script> 元素
前端·html
weixin_493503678 小时前
Vue3 前端生成 PDF:会员证书与活动签到表的三种打印方案与踩坑记录
前端·pdf·状态模式
李少兄9 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript