温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Vue中利用指令禁止反复发送请求

发布时间:2021-05-20 18:00:08 来源:亿速云 阅读:281 作者:Leah 栏目:web开发

今天就跟大家聊聊有关怎么在Vue中利用指令禁止反复发送请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

    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);  }, };

vue是什么

Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

看完上述内容,你们对怎么在Vue中利用指令禁止反复发送请求有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue
AI