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 节点遍历函数
Mar 28 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
JavaScript事件委托技术实例分析
Feb 06 Javascript
JavaScript中操作Mysql数据库实例
Apr 02 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
Aug 01 Javascript
js实现常用排序算法
Aug 09 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
详解自定义ajax支持跨域组件封装
Feb 08 Javascript
JS实现访问DOM对象指定节点的方法示例
Apr 04 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
Jul 01 Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
vue实现图片按比例缩放问题操作
Aug 11 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
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
javascript基本语法
2016/05/31 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python标准库os.path包、glob包使用实例
2014/11/25 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
党员2014两会学习心得体会
2014/03/17 职场文书
工作检讨书怎么写
2014/10/10 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android