在項目中,很多時候都需要loading加載動畫來緩解用戶的焦慮等待,比如說,我打開了一個頁面,而這個頁面有很多接口請求,但瀏覽器的請求並發數就那么幾個,再加上如果網速不行的話,那么這時候,用戶很可能就會糾結自己到底該不該留下來繼續等待呢。
所以,這時候,loading動畫就是一種緩解等待情緒的方式,當然還有更高端的,比如:骨架屏。有興趣的朋友可以自行研究,我后續也會找機會分享一下。
下面,開始本文的主要內容,目前我在用的是Vue 2.x版本,ajax
請求用的是axios
,UI框架用的是elementUI。所以下面的loading用的是UI框架中的組件。
嘮叨了這么多,接下來分享一下具體實現的代碼(里面很多代碼邏輯我已經去掉了,只剩下基礎的部分):
代碼可放在main.js
中。
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的樣式是可以自定義的,文案也是可以自定義的。