Vue 利用指令实现禁止反复发送请求的两种方法


Posted in Javascript onSeptember 15, 2019

前端做后台管控系统,在某些接口请求时间过长的场景下,需要防止用户反复发起请求。

假设某场景下用户点击查询按钮后,后端响应需要长时间才能返回数据。那么要规避用户返回点击查询按钮无外乎是让用户无法在合理时间内再次点击按钮。实现方式也有好几种:

1、在按钮点击发起请求后,弹个蒙层,显示个loading,等请求数据返回了将蒙层隐藏掉。

2、在按钮点击发起请求后,将按钮禁用掉,同样等数据返回了将按钮禁用解除。

以上是比较常见的2种方案。

实现上最简单的肯定是在需要的页面种在请求前和拿到数据后,单独处理。这种方案优点仅仅是简单,但是每个需要处理的页面都要单独写一串重复的代码,哪怕利用mixin也要多不少冗余代码。

如果是利用指令的方式仅仅需要在合适的地方加上个一条v-xxxx,其他都在指令的逻辑内统一处理。

以第二种方式为例:

clickForbidden.js

let forbidClick = null;
export default {
 bind(e) {
  const el = e;
  let timer = null;
  forbidClick = () => {
   el.disabled = true;
   el.classList.add('is-disabled');
   timer = setTimeout(() => {
   el.disabled = false; 
    el.classList.remove('is-disabled');
   }, 3000);
  };
  el.addEventListener('click', forbidClick);
 },
 unbind() {
  document.removeEventListener('click', forbidClick);
 },
};

指令的逻辑很简单,当按钮插入到DOM节点后,添加一个监听click的事件,当按钮点击后,就将按钮禁用,并加上一个禁用样式,并在3s后将该按钮解除禁用。

再考虑请求,以axios为例:

api.js

import axios from 'axios';
export baseURL = 'xxxx';
const api = axios.create({
 baseURL,<br data-filtered="filtered"> timeout: 3000,
});
/* 记录当前请求是否完成 */
window.currentResq = {
 done: true,
 config: {},
};
api.interceptors.request.use(function(config) {
 clearTimeout(resqTimer);
 window.currentResq = {
  done: false,
  config,
 };
 // 接口请求时长超过3s,则视为完成,不管请求结果成功或失败
 resqTimer = setTimeout(() => {
  window.currentResq = {
   done: true,
   config: {},
  };
 }, 3000);
});
api.interceptors.response.use(function(response) {
 const { config } = window.currentResq;
 const { url, method, data } = response.config;
 if (config.url === url && config.method === method && config.data === data) {
  clearTimeout(resqTimer);
  window.currentResq.done = true;
 }
 return response;
}, function (error) {
 return error;
});
 
export default api;

用一个全局的currentResq来作为请求是否完成的标志。在axios请求拦截器种,将当前请求的数据记录在currentResq中,并将done设置为false。在axios响应拦截器中,约定url,method,data3个参数一样时,就是当前currentResq中记录的请求返回数据,并将done设置为true。

同样的在指令逻辑中加入一个轮询监听currentResq的done是否完成。

clickForbidden.js 

let forbidClick = null;
export default {
 bind(e) {
  const el = e;
  let timer = null;
  forbidClick = () => {
   el.disabled = true;
   el.classList.add('is-disabled');
   timer = setInterval(() => {
    if (window.currentResq.done) {
     clearInterval(timer);
     el.disabled = false;
     el.classList.remove('is-disabled');
    }
   }, 500);
  };
  el.addEventListener('click', forbidClick);
 },
 unbind() {
  document.removeEventListener('click', forbidClick);
 },
};

这样就实现了只要在按钮上加上了v-clickForbidden。按钮点击后就会被禁用,仅当某个请求返回数据或者3s后将按钮的禁用解除。

现在仅仅考虑按钮一次仅发送了一个请求的场景,在currentResq中也可以用一个数据来记录请求。

总结

以上所述是小给大家介绍的Vue 利用指令实现禁止反复发送请求的两种方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
深入学习JavaScript对象
Oct 13 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 Javascript
javascript的document中的动态添加标签实现方法
Oct 24 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
JavaScript实现动态增删表格的方法
Mar 09 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
Vue中img的src是动态渲染时不显示的解决
Nov 14 Javascript
解决layui调用自定义方法提示未定义的问题
Sep 14 #Javascript
layui使用label标签的方法
Sep 14 #Javascript
使用layui定义一个模块并使用的例子
Sep 14 #Javascript
基于Layui自定义模块的使用方法详解
Sep 14 #Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 #Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 #Javascript
Layui Form 自定义验证的实例代码
Sep 14 #Javascript
You might like
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
JS表的模拟方法
2015/02/05 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
详解vue axios中文文档
2017/09/12 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python数字类型math库原理解析
2020/03/02 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
建筑学推荐信
2013/11/03 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
小学班主任个人总结
2015/03/03 职场文书
七一晚会主持词
2015/06/29 职场文书
500字作文之难忘的同学
2019/12/20 职场文书