在項目中,不少時候都須要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