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

一文教你如何優(yōu)雅的控制全局loading的顯示

 更新時(shí)間:2022年01月09日 15:59:44   作者:秦老六  
在我們的平時(shí)的工作中,在前后端交互的時(shí)候,為了提高頁(yè)面的觀賞性和用戶的體驗(yàn),我們會(huì)在頁(yè)面上添加loading來(lái)阻止用戶操作來(lái)等待接口的返回,這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的控制全局loading顯示的相關(guān)資料,需要的朋友可以參考下

在很多后臺(tái)管理系統(tǒng)中,發(fā)送請(qǐng)求的時(shí)候,需要打開一個(gè)loading,收到響應(yīng)后,需要關(guān)閉這個(gè)loading,對(duì)于這種通用的邏輯,我一般是在axios攔截器中做這種處理,因?yàn)椴皇敲總€(gè)請(qǐng)求都需要全局顯示loading,所以我在axios config中添加了一個(gè)標(biāo)記showLoading, 用于標(biāo)記發(fā)送請(qǐng)求之前是否需要顯示loading,自然收到響應(yīng)后,根據(jù)這個(gè)標(biāo)記確定是否需要關(guān)閉loading,在axios攔截器中的代碼如下:

axios.interceptors.request.use(
  (config) => {
    // config中不設(shè)置showLoading這個(gè)字段或者這個(gè)字段為true時(shí),代表需要全局顯示loading
    if (config.headers.showLoading !== false) {
      // 全局顯示loading
      Loading.showLoading();
    }
    return config;
  },
  (err) => {
    return Promise.reject(err);
  },
);

instance.interceptors.response.use(
  (response) => {
    const { config: { headers } } = response;
    if (headers.showLoading !== false) {
      // 關(guān)閉全局的loading
      Loading.hideLoading();
    }
    return data;
  }
);

我自己自然覺得上面那個(gè)實(shí)現(xiàn)自然滿足要求了,但是偶然一次和后端同事聊起這個(gè)問(wèn)題,后端同事說(shuō),這個(gè)前端的標(biāo)記(showLoading)怎么能傳遞給后端服務(wù)器了,并且還說(shuō),如果是他和我對(duì)接,絕對(duì)不允許我這么做。然后我就懵逼了,因?yàn)橄氩坏浇鉀Q辦法。

直到后來(lái)了解到洋蔥模型,其實(shí)請(qǐng)求,響應(yīng)天然的適用洋蔥模型,如果給axios添加上洋蔥模型,這個(gè)問(wèn)題就自然而然解決了啊。下面講解如何給axios添加洋蔥模型,如果有了洋蔥模型,axios攔截器就沒(méi)有必要了,因?yàn)檠笫[模型比axios攔截器更好用。

  • 聲明MiddleWareManager類,這個(gè)類是洋蔥模型的具體實(shí)現(xiàn),代碼如下。
// 中間件管理器,用于添加,刪除中間件。
// 另外這個(gè)添加的中間件給誰(shuí)用,也需要用參數(shù)(job)保存起來(lái)。
class MiddleWareManager {
  // 添加的中間件是給誰(shuí)用的,我們用job標(biāo)識(shí),如果中間件是給axios用,那么這個(gè)job就是axios方法。
  // middleWares用來(lái)保存中間件。
  // job和中間件都是返回Promise對(duì)象的方法。
  // 其中,job接受一個(gè)參數(shù)config,由最后一個(gè)中間件傳遞。
  // 中間件接受兩個(gè)參數(shù),一個(gè)是他之前的中間件傳遞的config,一個(gè)是執(zhí)行下一個(gè)中間件的方法。
  constructor(job) {
    // 這里默認(rèn)加上axios請(qǐng)求
    this.job = job;
    this.middleWares = [];
  }

  use(middleWare) {
    this.middleWares.unshift(middleWare);
    return this;
  }

  remove(middleWare) {
    const index = this.middleWares.indexOf(middleWare);
    this.middleWares.splice(index, 1);
    return this;
  }

  run(config) {
    const { length } = this.middleWares;
    function innerRun(config, index) {
      // 如果中間件已經(jīng)執(zhí)行完畢,這直接job函數(shù)。
      if (index >= length) {
        return this.job(config);
      }
      // 否則執(zhí)行下一個(gè)中間件函數(shù)
      return this.middleWares[index](config, (config) => innerRun(config, index++));
    }
    innerRun(config, 0);
  }
}
  • MiddleWareManager已經(jīng)實(shí)現(xiàn),接下來(lái)是講解如何將MiddleWareManager和axios組合到一起使用。我們會(huì)定義一個(gè)request方法,當(dāng)我們需要發(fā)送請(qǐng)求的時(shí)候,我們就統(tǒng)一調(diào)用request方法。
// middleWare1用于處理是否需要全局的顯示loading
async function middleWare1(config, next) {
  // 查看config中是否有showLoading標(biāo)記,如果沒(méi)有或者為true, 則需要全局顯示loading, 
  // 當(dāng)接收到響應(yīng)后,自然需要關(guān)閉loading
  // 自然收到響應(yīng)后,根據(jù)這個(gè)標(biāo)記確定是否需要關(guān)閉loading
  const { showLoading, ...rest } = config;
  if (showLoading !== false) {
    // 顯示loading動(dòng)畫
  }
  const response = await next(rest);
  if (showLoading !== false) {
    // 關(guān)閉動(dòng)畫
  }
  return response;
}

// 組裝MiddleWareManager
const manager = new MiddleWareManager(axios);
manager.use(middleWare1);

// 實(shí)現(xiàn)request方法,用于發(fā)送請(qǐng)求
function request(config) {
  return manager.run(config);
}
  • 當(dāng)我們發(fā)送請(qǐng)求需要全局打開loading時(shí),像如下做
request({
  url: 'xxx',
  method: 'get'
})

這樣在發(fā)送請(qǐng)求前,會(huì)自動(dòng)打開loading,當(dāng)接收到響應(yīng)后,會(huì)自動(dòng)關(guān)閉loading. 當(dāng)我們不需要自動(dòng)打開loading的功能時(shí),我們只需要在發(fā)送請(qǐng)求時(shí)在config中添加showLoading: false就可以了,代碼如下

request({
  url: 'xxx',
  method: 'get',
  showLoading: false
})

這樣做是不是滿足了后端同事的要求了呢!并且洋蔥模型也比攔截器使用起來(lái)更加方便,特別是在請(qǐng)求和響應(yīng)中訪問(wèn)相同的變量的時(shí)候。就如我們例子中的showLoading. 當(dāng)然我們也可以把攔截器中的更多功能移到洋蔥模型的中間件中,比如發(fā)送請(qǐng)求時(shí),自動(dòng)添加token。

總結(jié)

到此這篇關(guān)于如何優(yōu)雅的控制全局loading的顯示的文章就介紹到這了,更多相關(guān)控制全局loading顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于vue3.0公共組件自動(dòng)導(dǎo)入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Vue中實(shí)現(xiàn)權(quán)限控制的方法示例

    Vue中實(shí)現(xiàn)權(quán)限控制的方法示例

    這篇文章主要介紹了Vue中實(shí)現(xiàn)權(quán)限控制的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Element?el-tag標(biāo)簽圖文實(shí)例詳解

    Element?el-tag標(biāo)簽圖文實(shí)例詳解

    現(xiàn)在好多應(yīng)用場(chǎng)景里會(huì)有一些需要給文章打標(biāo)簽等類似的操作,下面這篇文章主要給大家介紹了關(guān)于Element?el-tag標(biāo)簽的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 深入詳解Vue3中的Mock數(shù)據(jù)模擬

    深入詳解Vue3中的Mock數(shù)據(jù)模擬

    這篇文章主要為大家介紹了深入Vue3中的Mock數(shù)據(jù)模擬實(shí)現(xiàn)細(xì)節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Vue常用API、高級(jí)API的相關(guān)總結(jié)

    Vue常用API、高級(jí)API的相關(guān)總結(jié)

    這篇文章主要介紹了Vue常用API、高級(jí)API的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • keep-Alive搭配vue-router實(shí)現(xiàn)緩存頁(yè)面效果的示例代碼

    keep-Alive搭配vue-router實(shí)現(xiàn)緩存頁(yè)面效果的示例代碼

    這篇文章主要介紹了keep-Alive搭配vue-router實(shí)現(xiàn)緩存頁(yè)面效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • vue3中事件總線mitt代碼實(shí)例(第三方庫(kù)mitt)

    vue3中事件總線mitt代碼實(shí)例(第三方庫(kù)mitt)

    這篇文章主要給大家介紹了關(guān)于vue3中事件總線mitt(第三方庫(kù)mitt)的相關(guān)資料,Mitt是一個(gè)在Vue.js應(yīng)用程序中使用的小型事件總線庫(kù),該庫(kù)允許組件進(jìn)行通信,而不必過(guò)度依賴父級(jí)或子級(jí)組件之間的props,需要的朋友可以參考下
    2023-09-09
  • vue通過(guò)?API?監(jiān)聽數(shù)組的變化

    vue通過(guò)?API?監(jiān)聽數(shù)組的變化

    這篇文章主要介紹了vue通過(guò)?API?監(jiān)聽數(shù)組的變化,在?Vue?中,你可以通過(guò)監(jiān)聽數(shù)組的變化來(lái)更新界面,Vue?提供了一些特殊的語(yǔ)法以及?API?來(lái)實(shí)現(xiàn)對(duì)數(shù)組的監(jiān)聽,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Vue的Flux框架之Vuex狀態(tài)管理器

    Vue的Flux框架之Vuex狀態(tài)管理器

    本文內(nèi)容主要參考官方教程,為了方便理解,用更加通俗的文字講解Vuex,也原文內(nèi)容做一些重點(diǎn)引用。希望會(huì)對(duì)你有所幫助。
    2017-07-07
  • Vue3?通過(guò)作用域插槽實(shí)現(xiàn)樹形菜單嵌套組件

    Vue3?通過(guò)作用域插槽實(shí)現(xiàn)樹形菜單嵌套組件

    這篇文章主要為大家介紹了Vue3?通過(guò)作用域插槽實(shí)現(xiàn)樹形菜單嵌套組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

桓仁| 阜阳市| 毕节市| 道孚县| 霍林郭勒市| 平山县| 兰溪市| 屏山县| 鸡泽县| 西城区| 徐汇区| 同江市| 嵊泗县| 长葛市| 洪泽县| 泗水县| 伊春市| 黑龙江省| 肇州县| 湘西| 康乐县| 华池县| 昌宁县| 聊城市| 嘉祥县| 沁水县| 米泉市| 平远县| 济阳县| 乾安县| 江山市| 册亨县| 大余县| 寿阳县| 郁南县| 丹巴县| 锡林浩特市| 呼和浩特市| 乌鲁木齐县| 陆河县| 屏东县|