關於vue 全局loading方案


1.axios方案

在axios請求里面統一添加loading

先申明兩個變量,記錄頁面是否有loading和請求個數

let loadingInstance,//記錄頁面中存在的loading
loadingCount = 0 //記錄當前正在請求的數量

在請求開始的時候判斷頁面是不是有loading,如果沒有loading,就創建一個loading

響應的時候,關閉loading

錯誤的時候,關閉loading

 

這樣一來,就會有一個問題,頁面中有多個請求正在進行的時候,前面的請求提前收到響應,后面的loading就不會出來

 

 上面這個圖  loading 可能只會存在10s,其實應該是15s

解決辦法:

用一個變量記錄頁面的正在進行的請求數,並進行呢維護這個值,如果新來一個請求就加1,結束就減去1,錯誤的也減去1

在loading要進行關閉的時候判斷

只有這個值為0的時候才去關閉loading

代碼:

let loadingInstance,loadingCount = 0 //申明loading
//http request 攔截器
axios.interceptors.request.use(
    config => {
        console.log("打開前"+loadingCount)
        if (loadingCount == 0) {
            console.log("有loading了")
            console.log("打開時"+loadingCount)
            loadingInstance = Loading.service({
                lock: true,
                customClass: "z-index999",
                text: "數據加載中,請稍后...",
                spinner: "el-icon-loading",
                background: "rgba(0, 0, 0, 0.7)"
            })
        }
        loadingCount++
        let Authorization = cookies.get('access_token') ? { "Authorization": "Bearer " + cookies.get('access_token') } : {}
        let headers = {
            "language": "zh_cn",
            "Content-Type": "application/x-www-form-urlencoded"
        }
        config.headers = Object.assign(Authorization, headers)
        return config
    },
    error => {
        // loadingCount--
        // if (loadingInstance && loadingCount==0) {
        //     loadingInstance.close()
        // }
        return Promise.reject(err);
    }
);

//響應攔截器即異常處理
axios.interceptors.response.use(response => {
    loadingCount--
    console.log("關閉時的"+loadingCount)
    if (loadingInstance && loadingCount == 0) {
        loadingInstance.close()
    }
    //console.log(response)
    switch (response.status) {
        case 200:
            responseBefore(response)
            return response
            break
        case 400:
            return Promise.resolve({ code: response.status, message: '錯誤請求' })
            break
        case 401:
            return Promise.resolve({ code: response.status, message: '未授權,請重新登錄' })
            break
        default:
            return Promise.resolve({ status: response.status, message: '未知錯誤' })
            break
    }
}, error => {
    // loadingCount--
    // if (loadingInstance && loadingCount == 0) {
    //     loadingInstance.close()
    // }
    console.warn(`timeout of ${axios_defaults_timeout}ms exceeded`);
    return Promise.reject(error)
})

 

 

 

將loading繼續進行封裝(帶參數)

import { Loading } from 'element-ui'
 
let loadingCount = 0
let loading
 
const startLoading = (options = {}) => {
    loading = Loading.service({
        lock: true,
        text: '加載中……',
        background: 'rgba(0, 0, 0, 0.7)',
        ...options,
    })
}
 
const endLoading = () => {
    loading.close()
}
 
export const showLoading = (options) => {
    if (loadingCount === 0) {
        startLoading(options)
    }
    loadingCount += 1
}
 
export const hideLoading = () => {
    if (loadingCount <= 0) {
        return
    }
    loadingCount -= 1
    if (loadingCount === 0) {
        endLoading()
    }
}

export default function(Vue) {
      //添加全局API
     Vue.prototype.$loading = {
        showLoading,
        hideLoading
    }
}

 

main.js引入;

import loading from '@frameworks/assets/js/Loading'

注意一定要use

Vue.use(loading)

最后一步就是調用了

this.$loading.showLoading()//打開
this.$loading.hideLoading()//關閉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM