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');
        }
      });
    }
  }
})
相关推荐
讨厌吃蛋黄酥2 分钟前
利用Mock实现前后端联调的解决方案
前端·javascript·后端
zzywxc78724 分钟前
在处理大数据列表渲染时,React 虚拟列表是提升性能的关键技术,但在实际实现中常遇到渲染抖动和滚动定位偏移等问题。
前端·javascript·人工智能·深度学习·react.js·重构·ecmascript
Hello.Reader1 小时前
Rust → WebAssembly 的性能剖析全指南
前端·rust·wasm
前端小巷子1 小时前
Vue 2 Diff 算法
前端·vue.js·面试
奕辰杰5 小时前
关于npm前端项目编译时栈溢出 Maximum call stack size exceeded的处理方案
前端·npm·node.js
JiaLin_Denny7 小时前
如何在NPM上发布自己的React组件(包)
前端·react.js·npm·npm包·npm发布组件·npm发布包
_Kayo_7 小时前
VUE2 学习笔记14 nextTick、过渡与动画
javascript·笔记·学习
路光.8 小时前
触发事件,按钮loading状态,封装hooks
前端·typescript·vue3hooks
我爱996!8 小时前
SpringMVC——响应
java·服务器·前端