最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue 利用指令實(shí)現(xiàn)禁止反復(fù)發(fā)送請(qǐng)求的兩種方法

 更新時(shí)間:2019年09月15日 09:33:34   作者:悠悠洛  
這篇文章主要介紹了Vue 利用指令實(shí)現(xiàn)禁止反復(fù)發(fā)送請(qǐng)求的兩種方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前端做后臺(tái)管控系統(tǒng),在某些接口請(qǐng)求時(shí)間過(guò)長(zhǎng)的場(chǎng)景下,需要防止用戶反復(fù)發(fā)起請(qǐng)求。

  假設(shè)某場(chǎng)景下用戶點(diǎn)擊查詢按鈕后,后端響應(yīng)需要長(zhǎng)時(shí)間才能返回?cái)?shù)據(jù)。那么要規(guī)避用戶返回點(diǎn)擊查詢按鈕無(wú)外乎是讓用戶無(wú)法在合理時(shí)間內(nèi)再次點(diǎn)擊按鈕。實(shí)現(xiàn)方式也有好幾種:

    1、在按鈕點(diǎn)擊發(fā)起請(qǐng)求后,彈個(gè)蒙層,顯示個(gè)loading,等請(qǐng)求數(shù)據(jù)返回了將蒙層隱藏掉。

    2、在按鈕點(diǎn)擊發(fā)起請(qǐng)求后,將按鈕禁用掉,同樣等數(shù)據(jù)返回了將按鈕禁用解除。

  以上是比較常見(jiàn)的2種方案。

  實(shí)現(xiàn)上最簡(jiǎn)單的肯定是在需要的頁(yè)面種在請(qǐng)求前和拿到數(shù)據(jù)后,單獨(dú)處理。這種方案優(yōu)點(diǎn)僅僅是簡(jiǎn)單,但是每個(gè)需要處理的頁(yè)面都要單獨(dú)寫(xiě)一串重復(fù)的代碼,哪怕利用mixin也要多不少冗余代碼。

  如果是利用指令的方式僅僅需要在合適的地方加上個(gè)一條v-xxxx,其他都在指令的邏輯內(nèi)統(tǒng)一處理。

  以第二種方式為例:

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

    指令的邏輯很簡(jiǎn)單,當(dāng)按鈕插入到DOM節(jié)點(diǎn)后,添加一個(gè)監(jiān)聽(tīng)click的事件,當(dāng)按鈕點(diǎn)擊后,就將按鈕禁用,并加上一個(gè)禁用樣式,并在3s后將該按鈕解除禁用。

  再考慮請(qǐng)求,以axios為例:

api.js

import axios from 'axios';
export baseURL = 'xxxx';
const api = axios.create({
 baseURL,<br data-filtered="filtered"> timeout: 3000,
});
/* 記錄當(dāng)前請(qǐng)求是否完成 */
window.currentResq = {
 done: true,
 config: {},
};
api.interceptors.request.use(function(config) {
 clearTimeout(resqTimer);
 window.currentResq = {
  done: false,
  config,
 };
 // 接口請(qǐng)求時(shí)長(zhǎng)超過(guò)3s,則視為完成,不管請(qǐng)求結(jié)果成功或失敗
 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;

  用一個(gè)全局的currentResq來(lái)作為請(qǐng)求是否完成的標(biāo)志。在axios請(qǐng)求攔截器種,將當(dāng)前請(qǐng)求的數(shù)據(jù)記錄在currentResq中,并將done設(shè)置為false。在axios響應(yīng)攔截器中,約定url,method,data3個(gè)參數(shù)一樣時(shí),就是當(dāng)前currentResq中記錄的請(qǐng)求返回?cái)?shù)據(jù),并將done設(shè)置為true。

  同樣的在指令邏輯中加入一個(gè)輪詢監(jiān)聽(tīng)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);
 },
};

  這樣就實(shí)現(xiàn)了只要在按鈕上加上了v-clickForbidden。按鈕點(diǎn)擊后就會(huì)被禁用,僅當(dāng)某個(gè)請(qǐng)求返回?cái)?shù)據(jù)或者3s后將按鈕的禁用解除。

  現(xiàn)在僅僅考慮按鈕一次僅發(fā)送了一個(gè)請(qǐng)求的場(chǎng)景,在currentResq中也可以用一個(gè)數(shù)據(jù)來(lái)記錄請(qǐng)求。

總結(jié)

以上所述是小給大家介紹的Vue 利用指令實(shí)現(xiàn)禁止反復(fù)發(fā)送請(qǐng)求的兩種方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問(wèn)題

    vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問(wèn)題

    這篇文章主要介紹了vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue實(shí)現(xiàn)點(diǎn)擊顯示不同圖片的效果

    Vue實(shí)現(xiàn)點(diǎn)擊顯示不同圖片的效果

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)點(diǎn)擊顯示不同圖片的效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • vue開(kāi)發(fā)實(shí)現(xiàn)評(píng)論列表

    vue開(kāi)發(fā)實(shí)現(xiàn)評(píng)論列表

    這篇文章主要為大家詳細(xì)介紹了vue開(kāi)發(fā)實(shí)現(xiàn)評(píng)論列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue3.x項(xiàng)目中,出現(xiàn)紅色波浪線問(wèn)題及解決

    vue3.x項(xiàng)目中,出現(xiàn)紅色波浪線問(wèn)題及解決

    這篇文章主要介紹了vue3.x項(xiàng)目中,出現(xiàn)紅色波浪線問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue 翻頁(yè)組件vue-flip-page效果

    vue 翻頁(yè)組件vue-flip-page效果

    這篇文章主要介紹了vue 翻頁(yè)組件vue-flip-page,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Vue 3.0中Treeshaking特性及作用

    Vue 3.0中Treeshaking特性及作用

    Tree shaking 是一種通過(guò)清除多余代碼方式來(lái)優(yōu)化項(xiàng)目打包體積的技術(shù),就是在保持代碼運(yùn)行結(jié)果不變的前提下,去除無(wú)用的代碼,本文給大家介紹Vue 3.0中Treeshaking特性是什么,感興趣的朋友一起看看吧
    2023-10-10
  • Vue插槽具體用法及實(shí)例分析

    Vue插槽具體用法及實(shí)例分析

    本文主要介紹了Vue框架中插槽的使用方法和應(yīng)用場(chǎng)景。通過(guò)具體實(shí)例分析,詳細(xì)講解了插槽的具體用法,幫助讀者深入理解Vue中插槽的使用和實(shí)現(xiàn)方式
    2023-05-05
  • 詳解vue過(guò)濾器在v2.0版本用法

    詳解vue過(guò)濾器在v2.0版本用法

    本篇文章主要介紹了vue過(guò)濾器在v2.0版本用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Vue通過(guò)input篩選數(shù)據(jù)

    Vue通過(guò)input篩選數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Vue通過(guò)input篩選數(shù)據(jù)的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 詳解滑動(dòng)穿透(鎖body)終極探索

    詳解滑動(dòng)穿透(鎖body)終極探索

    這篇文章主要介紹了滑動(dòng)穿透(鎖body),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

江陵县| 合山市| 北辰区| 岐山县| 方正县| 潢川县| 昆山市| 滦南县| 辉县市| 丹东市| 抚宁县| 丁青县| 章丘市| 山东省| 南投市| 陇川县| 安庆市| 丰宁| 抚顺市| 铜川市| 新郑市| 洛阳市| 大连市| 陆川县| 东山县| 阜新市| 紫金县| 长丰县| 保山市| 高碑店市| 曲靖市| 霞浦县| 同心县| 邵阳市| 泾阳县| 饶阳县| 徐州市| 陇西县| 柳河县| 安岳县| 隆子县|