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

從eleUI的Loading知道了單例模式的用法

 更新時間:2024年01月24日 15:04:59   作者:土豆Coder  
這篇文章主要介紹了從eleUI的Loading知道了單例模式的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

從eleUI的Loading知道了單例模式

現(xiàn)象

在使用elementUI開始一個vue項目,

為了更好的用戶體驗,需要在接口請求的時候添加全局的Loading

所以在接口處理文件中,

在請求攔截的時候添加Loading,在響應(yīng)攔截的時候取消Loading

import axios from 'axios'
import { Message, Loading } from 'element-ui'

let instance = axios.create({
  baseURL: '',
  timeout: 60000
})

let loadingInstance = null

// 請求攔截
instance.interceptors.request.use((config) => {
  loadingInstance = Loading.service({
    fullscreen: true,
    text: '拼命加載中...',
    background: 'rgba(0, 0, 0, 0.8)'
  })
  return config
}, (error) => {
  loadingInstance.close()
  Message.error({message: '請求超時!'})
  return Promise.reject(error)
})

// 響應(yīng)攔截
instance.interceptors.response.use((response) => {
  loadingInstance.close()
  if (response.data && response.data.code && response.data.code === 200) {
    return response.data
  } else {
    Message({
      message: response.data.msg || '接口錯誤',
      type: 'error'
    })
  }
}, (error) => {
  loadingInstance.close()
  return Promise.reject(error)
})

export default instance

優(yōu)化

邏輯似乎很合理,但是實際項目中發(fā)現(xiàn),如果某個頁面請求多個接口,且每個接口都返回很慢的話,實際看到的效果是雖然Loading會出現(xiàn),但是當?shù)谝粋€接口返回值以后后面的Loading都不會出現(xiàn)了,就會出現(xiàn)頁面數(shù)據(jù)從無到有的過濾,用戶體驗較差。

原來,是因為elementUI的全屏Loading是單例的:如果前一個Loading關(guān)閉之前再次調(diào)用了下一個Loading并不會創(chuàng)建一個新的實例,返回的仍然是當前這個Loading實例;同理,當調(diào)用任意一個close()方法都會關(guān)閉這個Loading實例。

因為這幾個接口都是同一時間請求的,也就是說當前頁面幾個Loading實例其實都是同一個,所以關(guān)閉后也就都關(guān)閉了。

改進后:

import axios from 'axios'
import { Message, Loading } from 'element-ui'

let instance = axios.create({
  baseURL: '',
  timeout: 60000
})

/* 當頁面有兩個接口時,第一個接口loading的close事件會直接將第二個接口的loading實例也close */
let loadingInstance = null

function startLoading () {
  loadingInstance = Loading.service({
    fullscreen: true,
    text: '拼命加載中...',
    background: 'rgba(0, 0, 0, 0.8)'
  })
}

function endLoading () {
  loadingInstance.close()
}

let needLoadingRequestCount = 0

function showFullScreenLoading () {
  if (needLoadingRequestCount === 0) {
    startLoading()
  }
  needLoadingRequestCount++
}

function tryHideFullScreenLoading () {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}

// 請求攔截
instance.interceptors.request.use((config) => {
  showFullScreenLoading()
  return config
}, (error) => {
  tryHideFullScreenLoading()
  Message.error({message: '請求超時!'})
  return Promise.reject(error)
})

// 響應(yīng)攔截
instance.interceptors.response.use((response) => {
  tryHideFullScreenLoading()
  if (response.data && response.data.code && response.data.code === 200) {
    return response.data
  } else {
    Message({
      message: response.data.msg || '接口錯誤',
      type: 'error'
    })
  }
}, (error) => {
  tryHideFullScreenLoading()
  return Promise.reject(error)
})

export default instance

每次創(chuàng)建Loading實例的時候判斷當前是否存在,如果當前還沒有Loading實例就創(chuàng)建一個,如果有就不會再創(chuàng)建而是計數(shù);

每次關(guān)閉的時候判斷當前的計數(shù),如果是0了就關(guān)閉,否則也計數(shù)減一,直到為0的時候表示當前所有頁面所有接口都返回結(jié)束了,此時執(zhí)行關(guān)閉Loading.close()操作關(guān)閉菊花。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue2.0和mintui-infiniteScroll結(jié)合如何實現(xiàn)無線滾動加載

    vue2.0和mintui-infiniteScroll結(jié)合如何實現(xiàn)無線滾動加載

    這篇文章主要介紹了vue2.0和mintui-infiniteScroll結(jié)合如何實現(xiàn)無線滾動加載,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 使用vue-office預(yù)覽word文檔的功能詳解

    使用vue-office預(yù)覽word文檔的功能詳解

    這篇文章主要為大家詳細介紹了如何使用vue-office預(yù)覽word文檔的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • 詳解Vite+JavaScript+Vue+Yarn實現(xiàn)登錄頁面實戰(zhàn)

    詳解Vite+JavaScript+Vue+Yarn實現(xiàn)登錄頁面實戰(zhàn)

    本文主要介紹了Vite+JavaScript+Vue+Yarn實現(xiàn)登錄頁面實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • Vue如何使用js-audio-recorder插件實現(xiàn)錄音功能并將文件轉(zhuǎn)成wav上傳

    Vue如何使用js-audio-recorder插件實現(xiàn)錄音功能并將文件轉(zhuǎn)成wav上傳

    這篇文章主要給大家介紹了關(guān)于Vue如何使用js-audio-recorder插件實現(xiàn)錄音功能并將文件轉(zhuǎn)成wav上傳的相關(guān)資料,文中通過示例代碼講解了彈窗界面、變量控制、錄音啟動與停止、波形可視化、文件上傳及WAV格式獲取的完整流程,需要的朋友可以參考下
    2025-06-06
  • vue 使用post/get 下載導(dǎo)出文件操作

    vue 使用post/get 下載導(dǎo)出文件操作

    這篇文章主要介紹了vue 使用post/get 下載導(dǎo)出文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • webpack+vue.js實現(xiàn)組件化詳解

    webpack+vue.js實現(xiàn)組件化詳解

    vue的開發(fā)體驗還是比較愉悅的。首先文檔非常友好,所以上手會比較快。其次,配合webpack和vue-loader,每個頁面都是一個.vue文件,寫起來很方便。所以很適合做組件化開發(fā),這篇文章我們就來一起看看webpack+vue.js如何實現(xiàn)組件化。
    2016-10-10
  • Vue中實現(xiàn)可切換顯示/隱藏側(cè)邊欄的按鈕的示例代碼

    Vue中實現(xiàn)可切換顯示/隱藏側(cè)邊欄的按鈕的示例代碼

    這篇文章主要介紹了如何在Vue應(yīng)用中實現(xiàn)一個可切換顯示/隱藏側(cè)邊欄的按鈕,通過設(shè)計基本結(jié)構(gòu)、管理數(shù)據(jù)狀態(tài)、實現(xiàn)CSS樣式切換、核心實現(xiàn)原理、交互體驗優(yōu)化和動畫效果,最終實現(xiàn)了側(cè)邊欄的平滑顯示/隱藏功能,并提升了用戶體驗,感興趣的小伙伴可以參考下
    2025-11-11
  • el-form組件使用resetFields重置失效的問題解決

    el-form組件使用resetFields重置失效的問題解決

    用el-form寫了包含三個字段的表單,使用resetFields方法進行重置,發(fā)現(xiàn)點擊重置或要清空校驗時是失效的,所以本文給大家介紹了el-form組件使用resetFields重置失效的問題解決,需要的朋友可以參考下
    2023-12-12
  • 淺談vue中g(shù)et請求解決傳輸數(shù)據(jù)是數(shù)組格式的問題

    淺談vue中g(shù)et請求解決傳輸數(shù)據(jù)是數(shù)組格式的問題

    這篇文章主要介紹了淺談vue中g(shù)et請求解決傳輸數(shù)據(jù)是數(shù)組格式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vuex的輔助函數(shù)該如何使用

    vuex的輔助函數(shù)該如何使用

    vue通過輔助函數(shù)mapState、mapActions、mapMutations,把vuex.store中的屬性映射到vue實例身上,這樣在vue實例中就能訪問vuex.store中的屬性了,對于操作vuex.store就很方便了,本文具體的介紹下這些輔助函數(shù)的使用方法
    2021-06-06

最新評論

灵丘县| 金堂县| 泸水县| 东乡县| 芷江| 渭南市| 萨迦县| 肥城市| 奉新县| 于田县| 庐江县| 年辖:市辖区| 西畴县| 鞍山市| 广东省| 东兴市| 大城县| 资阳市| 蓬安县| 台北县| 阿巴嘎旗| 兴安盟| 潼关县| 甘南县| 青冈县| 讷河市| 石家庄市| 泰安市| 浪卡子县| 龙胜| 海盐县| 铁力市| 双辽市| 若羌县| 潼南县| 新蔡县| 平遥县| 临潭县| 浦东新区| 西城区| 咸阳市|