vue+elementUI+axios實現的全局loading加載動畫

在項目中,不少時候都須要loading加載動畫來緩解用戶的焦慮等待,好比說,我打開了一個頁面,而這個頁面有不少接口請求,但瀏覽器的請求併發數就那麼幾個,再加上若是網速不行的話,那麼這時候,用戶極可能就會糾結本身到底該不應留下來繼續等待呢。javascript

因此,這時候,loading動畫就是一種緩解等待情緒的方式,固然還有更高端的,好比:骨架屏。有興趣的朋友能夠自行研究,我後續也會找機會分享一下。css

下面,開始本文的主要內容,目前我在用的是Vue 2.x版本,ajax請求用的是axios,UI框架用的是elementUI。因此下面的loading用的是UI框架中的組件。vue

嘮叨了這麼多,接下來分享一下具體實現的代碼(裏面不少代碼邏輯我已經去掉了,只剩下基礎的部分):java

代碼可放在main.js中。ios

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'
 
// loading框設置局部刷新,且全部請求完成後關閉loading框
let loading
let needLoadingRequestCount = 0 // 聲明一個對象用於存儲請求個數
function startLoading () {
  loading = Vue.prototype.$loading({
    lock: true,
    text: '努力加載中...',
    background: 'rgba(0,0,0,0.5)',
    target: document.querySelector('.loading-area') // 設置加載動畫區域
  })
}
function endLoading () {
  loading.close()
}
function showFullScreenLoading () {
  if (needLoadingRequestCount === 0) {
    startLoading()
  }
  needLoadingRequestCount++
}
function hideFullScreenLoading () {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}
 
// axios
axios.defaults.baseURL = process.env.NODE_ENV === 'production' ? '' : '/api' // 接口基礎路徑
axios.defaults.timeout = 20000 // 超時時間 20s
// axios.defaults.withCredentials = true // 容許設置cookie(開啓的話需後端配置)
// http請求攔截器
axios.interceptors.request.use(config => {
  if (config.isLoading !== false) { // 若是配置了isLoading: false,則不顯示loading
    showFullScreenLoading()
  }
  config.headers['Content-Type'] = 'application/json;charset=UTF-8'
  return config
}, error => {
  hideFullScreenLoading()
  return Promise.reject(error.response)
})
// http響應攔截器
axios.interceptors.response.use(data => {
  hideFullScreenLoading() // 響應成功關閉loading
  return data
}, error => {
  hideFullScreenLoading()
  let _status = error.response && error.response.status
  if (_status === 504 || _status === 404) {
    // 跳轉404頁面(目前沒有,只能先跳轉首頁)
    //router.push({ path: '/' })
  }
  return Promise.reject(error)
})
Vue.prototype.$http = axios

  ok,上面的代碼就實現了全屏的loading動畫。
注意:loading的樣式是能夠自定義的,文案也是能夠自定義的。ajax

相關文章
相關標籤/搜索