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 相关文章推荐
求得div 下 img的src地址的js代码
Feb 28 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
JavaScript 学习笔记之变量及其作用域
Jan 14 Javascript
jQuery自定义滚动条完整实例
Jan 08 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
超实用的JavaScript代码段 附使用方法
May 22 Javascript
JavaScript实现九九乘法表的简单实例
Jun 07 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
Jul 07 Javascript
jQuery解析XML 详解及方法总结
Sep 28 Javascript
js无提示关闭浏览器窗口的两种方法分析
Nov 06 Javascript
jQuery中layer分页器的使用
Mar 13 Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 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
程序员编程十条戒律
2009/07/09 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
基于python实现的抓取腾讯视频所有电影的爬虫
2016/04/22 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
一道SQL面试题
2012/12/31 面试题
外贸英语专业求职信范文
2013/12/25 职场文书
大四自我鉴定
2014/02/08 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
高老头读书笔记
2015/06/30 职场文书
英文投诉信格式
2015/07/03 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android