当前位置: 首页 > news >正文

Vue全局指令防止重复点击(等待请求)

继《vue之全局请求loading》之后,总觉得全局loading有时候不太…友好,所以总想将loading加到被点击的元素上面,于是乎就想到了点击事件与请求方法相关联,本想重写组件的click方法,但是这样对组件的影响太大,所以放弃了,最终想到了Vue全局指令。

一、实现原理

通过全局指令代替组件事件,在全局指令中绑定click事件,当dom被点击时,给dom添加禁用状态,利用闭包等方式获取到绑定的方法,通过await等待方法执行完毕然后去掉禁用;

二、使用

@click替换为v-con-click

<el-button type="primary" icon="el-icon-search" size="mini" v-con-click="handleQuery">搜索</el-button>

三、注意事项

1. 同步和异步回调只能选一种

同步通过await来等待去除禁用,而异步回调则是由自己判断去掉禁用。

同步(没有传参):

handleQuery(e) {console.log(e); // 没有传参时,默认为点击事件this.queryParams.pageNum = 1;await this.getList();
}

异步回调(没有传参):

handleQuery() {console.log(e); // 没有传参,默认为点击事件return (removeDisabled) => {this.queryParams.pageNum = 1;this.getList().then(res => {// 去掉组件禁用removeDisabled();})}
}

2. 异步回调需闭包

因需要回传回调方法,所以需添加一层闭包;

3. 有传参的方法需闭包

因有参数的方法相当于绑定时会自动执行一遍,所以添加闭包,来获取执行代码。

handleQuery(d) {return (removeDisabled) => {this.queryParams.pageNum = 1;this.getList().then(res => {// 去掉组件禁用removeDisabled();})}
}

所以对于有参数的方法异步回调就相当于两次闭包

handleQuery(d) {return (e) => {console.log(e); // 点击事件return (removeDisabled) => {// 去掉组件禁用removeDisabled();}}
}

3. 其他问题

因想法特殊,可能会出现未知问题,目前暂未发现其他问题,如有问题,欢迎即使提出。

四、代码

const conClickDirective = {bind(el, binding, vnode) {el.addEventListener('click', async e => {let hasCb = false;el.classList.add('is-disabled');el.disabled = true;// 这里写点击事件的逻辑if (binding.value instanceof Function) {const res = await binding.value(e);if (res instanceof Function) {const d = res(() => {el.disabled = false;el.classList.remove('is-disabled');})if (!(d instanceof Promise)) {hasCb = true;} else {await d;}}}if (!hasCb) {el.disabled = false;el.classList.remove('is-disabled');}});}
};// 全局注册自定义指令
Vue.directive('con-click', conClickDirective);

五、进阶版

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

http://www.lryc.cn/news/304701.html

相关文章:

  • 数据库索引面试的相关问题
  • Spring启动生命周期
  • 瑞芯微RK3568芯片介绍
  • 15.一种坍缩式的简单——组合模式详解
  • Node.js的debug模块源码分析及在harmonyOS平台移植
  • 【Crypto | CTF】BUUCTF RSA2
  • 单片机学习笔记---红外遥控红外遥控电机调速(完结篇)
  • Linux第62步_备份移植好的所有的文件和文件夹
  • 【xss跨站漏洞】xss漏洞前置知识点整理
  • mac下mysql 常用命令
  • 2.21号qt
  • 什么是MVVM?MVC、MVP与MVVM模式的区别?
  • ElementUI组件的安装和使用
  • Laravel01 课程介绍以及Laravel环境搭建
  • 面试redis篇-03缓存击穿
  • k8s容器以及基础设施优化
  • 蓝桥杯备赛系列——倒计时50天!
  • jenkins配置ssh的时候测试连接出现Algorithm negotiation fail
  • 思维模型整合
  • 代理模式笔记
  • 手机中有哪些逆向进化的功能
  • LeetCode24.两两交换链表中的节点
  • Eureka注册中心(黑马学习笔记)
  • unity-firebase-Analytics分析库对接后数据不显示原因,及最终解决方法
  • JWT(JSON Web Token)原理、应用与安全性分析
  • Redis 缓存(Cache)
  • ChatGPT回答模式
  • 戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)
  • Mysql数据库主从集群从库Slave因为RelayLog过多过大引起服务器硬盘爆满生产事故实战解决
  • QT基本组件