欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

從eleUI的Loading知道了單例模式

現(xiàn)象

在使用elementUI開始一個(gè)vue項(xiàng)目,

為了更好的用戶體驗(yàn),需要在接口請(qǐng)求的時(shí)候添加全局的Loading

所以在接口處理文件中,

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

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

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

let loadingInstance = null

// 請(qǐng)求攔截
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: '請(qǐng)求超時(shí)!'})
  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 || '接口錯(cuò)誤',
      type: 'error'
    })
  }
}, (error) => {
  loadingInstance.close()
  return Promise.reject(error)
})

export default instance

優(yōu)化

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

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

因?yàn)檫@幾個(gè)接口都是同一時(shí)間請(qǐng)求的,也就是說當(dāng)前頁(yè)面幾個(gè)Loading實(shí)例其實(shí)都是同一個(gè),所以關(guān)閉后也就都關(guān)閉了。

改進(jìn)后:

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

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

/* 當(dāng)頁(yè)面有兩個(gè)接口時(shí),第一個(gè)接口loading的close事件會(huì)直接將第二個(gè)接口的loading實(shí)例也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()
  }
}

// 請(qǐng)求攔截
instance.interceptors.request.use((config) => {
  showFullScreenLoading()
  return config
}, (error) => {
  tryHideFullScreenLoading()
  Message.error({message: '請(qǐng)求超時(shí)!'})
  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 || '接口錯(cuò)誤',
      type: 'error'
    })
  }
}, (error) => {
  tryHideFullScreenLoading()
  return Promise.reject(error)
})

export default instance

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

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

總結(jié)

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

相關(guān)文章

  • vue項(xiàng)目下,如何用命令直接修復(fù)ESLint報(bào)錯(cuò)

    vue項(xiàng)目下,如何用命令直接修復(fù)ESLint報(bào)錯(cuò)

    這篇文章主要介紹了vue項(xiàng)目下,如何用命令直接修復(fù)ESLint報(bào)錯(cuò),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • WebSocket使用以及在vue如何使用問題

    WebSocket使用以及在vue如何使用問題

    這篇文章主要介紹了WebSocket使用以及在vue如何使用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 深入理解Vue 單向數(shù)據(jù)流的原理

    深入理解Vue 單向數(shù)據(jù)流的原理

    這篇文章主要介紹了深入理解Vue 單向數(shù)據(jù)流的原理,詳細(xì)的介紹了Vue 單向數(shù)據(jù)流的原理和使用,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-11-11
  • Vue?watch中監(jiān)聽值的變化,判斷后修改值方式

    Vue?watch中監(jiān)聽值的變化,判斷后修改值方式

    這篇文章主要介紹了Vue?watch中監(jiān)聽值的變化,判斷后修改值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 幾分鐘弄懂Vuex的五大屬性和使用方式

    幾分鐘弄懂Vuex的五大屬性和使用方式

    這篇文章主要介紹了幾分鐘弄懂Vuex的五大屬性和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vuex2.0+Vue2.0構(gòu)建備忘錄應(yīng)用實(shí)踐

    Vuex2.0+Vue2.0構(gòu)建備忘錄應(yīng)用實(shí)踐

    這篇文章主要為大家詳細(xì)介紹了Vuex2.0+Vue2.0構(gòu)建備忘錄應(yīng)用實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • vue遍歷生成的輸入框 綁定及修改值示例

    vue遍歷生成的輸入框 綁定及修改值示例

    今天小編就為大家分享一篇vue遍歷生成的輸入框 綁定及修改值示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Element-UI結(jié)合遞歸組件實(shí)現(xiàn)后臺(tái)管理系統(tǒng)左側(cè)菜單

    Element-UI結(jié)合遞歸組件實(shí)現(xiàn)后臺(tái)管理系統(tǒng)左側(cè)菜單

    在Vue.js中使用遞歸組件可以方便地構(gòu)建多層級(jí)的菜單結(jié)構(gòu),遞歸組件適用于處理具有嵌套關(guān)系的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • vue2項(xiàng)目導(dǎo)出操作實(shí)現(xiàn)方法(后端接口導(dǎo)出、前端直接做導(dǎo)出)

    vue2項(xiàng)目導(dǎo)出操作實(shí)現(xiàn)方法(后端接口導(dǎo)出、前端直接做導(dǎo)出)

    這篇文章主要給大家介紹了關(guān)于vue2項(xiàng)目導(dǎo)出操作實(shí)現(xiàn)方法的相關(guān)資料,文中介紹的是后端接口導(dǎo)出、前端直接做導(dǎo)出,通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-05-05
  • vue中el-select 和el-tree二次封裝實(shí)現(xiàn)

    vue中el-select 和el-tree二次封裝實(shí)現(xiàn)

    本文介紹了vue中el-select 和el-tree二次封裝實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評(píng)論