vue elementUI axios實(shí)現(xiàn)的全局loading加載動(dòng)畫

在請(qǐng)求較多的應(yīng)用中,loading是必不可少的,否則人們不是認(rèn)為程序卡了就是認(rèn)為設(shè)備卡了

普通的項(xiàng)目中锈至,每次請(qǐng)求基本都要手動(dòng)寫一下loading的出現(xiàn)和消失,且不說有些麻煩译秦,而且在ajax異步的情況下峡捡,如果做不好loading同步,經(jīng)常會(huì)出現(xiàn)loading不出現(xiàn)的情況诀浪,而且不同瀏覽器兼容性較差棋返。

一.概念

在vue項(xiàng)目中,有了統(tǒng)一配置機(jī)制雷猪,可以實(shí)現(xiàn)對(duì)loading的配置使每次請(qǐng)求前自動(dòng)出現(xiàn)loading,請(qǐng)求后loading消失

順帶一提晰房,本來ajax調(diào)為同步模式挺好用的求摇,但axios沒有同步功能

關(guān)于elementui的loading,教程在這里:https://element.eleme.cn/2.0/#/zh-CN/component/loading

圖片發(fā)自簡(jiǎn)書App
  • 第一種方法是在需要出現(xiàn)loading的地方加著v-loading 指令殊者,此方法在小應(yīng)用中可以用与境,在大型應(yīng)用中顯得過于繁瑣

  • 第二種是服務(wù)方式:

圖片發(fā)自簡(jiǎn)書App

最后一句話是重點(diǎn),也就是說如果頁面有多個(gè)請(qǐng)求一起請(qǐng)求猖吴,如果都使用一個(gè)服務(wù)loading摔刁,很可能會(huì)出現(xiàn)較快結(jié)束請(qǐng)求的那個(gè)直接把loading關(guān)了,而請(qǐng)求時(shí)間長(zhǎng)的還沒有結(jié)束請(qǐng)求海蔽。這點(diǎn)在下面設(shè)計(jì)的時(shí)候需要關(guān)注

二.實(shí)現(xiàn)

在main.js中共屈,引入vue,axios,elementui

import Vue from 'vue'
import App from './App'
import router from './router'
 
import elementui from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
 
import axios from 'axios'
 
import {Loading} from 'element-ui'

//修改原型鏈,全局使用axios,這樣之后可在每個(gè)組件的methods中調(diào)用$axios命令完成數(shù)據(jù)請(qǐng)求
Vue.prototype.$axios=axios
// 安裝各類插件
Vue.use(elementui)
 
let loading;
//內(nèi)存中正在請(qǐng)求的數(shù)量
let loadingNum=0;
function startLoading() {    
    if(loadingNum==0){
        loading = Loading.service({
          lock: true,
          text: '拼命加載中...',
          background:'rgba(255,255,255,0.5)',
        })
    }
    //請(qǐng)求數(shù)量加1
    loadingNum++;
}
function endLoading() {
    //請(qǐng)求數(shù)量減1
    loadingNum--
    if(loadingNum<=0){
        loading.close()
    }
}
 
//請(qǐng)求數(shù)據(jù)攔截器
axios.interceptors.request.use(request => {
  startLoading();
  return request
}, err => {
  return Promise.reject(err);
});
 
 
//接收響應(yīng)攔截器
axios.interceptors.response.use(response => {
  endLoading();
  return response
}, err => {
  endLoading();
  if (err && err.response) {
    switch (err.response.status) {
      case 400: err.message = '請(qǐng)求錯(cuò)誤(400)'; break;
      case 401: this.$router.push('/login'); break;
      case 403: err.message = '拒絕訪問(403)'; break;
      case 404: err.message = '請(qǐng)求出錯(cuò)(404)'; break;
      case 408: err.message = '請(qǐng)求超時(shí)(408)'; break;
      case 500: err.message = '服務(wù)器錯(cuò)誤(500)'; break;
      case 501: err.message = '服務(wù)未實(shí)現(xiàn)(501)'; break;
      case 502: err.message = '網(wǎng)絡(luò)錯(cuò)誤(502)'; break;
      case 503: err.message = '服務(wù)不可用(503)'; break;
      case 504: err.message = '網(wǎng)絡(luò)超時(shí)(504)'; break;
      case 505: err.message = 'HTTP版本不受支持(505)'; break;
      default: err.message = `連接出錯(cuò)(${err.response.status})!`;
    }
  } else {
    err.message = '連接服務(wù)器失敗!'
  }
  message.error(err.message);
  return Promise.reject(err);
});
 
   
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App },
  data: {
    eventHub: new Vue()
  } 
})

因?yàn)閘oading只是一個(gè)實(shí)例党窜,所以需要加入了請(qǐng)求個(gè)數(shù)控制拗引,每次請(qǐng)求開始加一個(gè),請(qǐng)求結(jié)束減一個(gè)幌衣,當(dāng)請(qǐng)求個(gè)數(shù)為0時(shí)才使loading消失矾削。

這樣配置后應(yīng)用中其他組件每次調(diào)用axios請(qǐng)求都會(huì)自動(dòng)出現(xiàn)消失loading。

三.解決自定義樣式問題

到這里豁护,每次請(qǐng)求的loading樣式都一模一樣了哼凯,如果有的請(qǐng)求需要其他的loading樣式怎么辦呢?

利用服務(wù)中l(wèi)oading只有一個(gè)實(shí)例的原理楚里,只需要在請(qǐng)求之前就創(chuàng)建出一個(gè)loading實(shí)例断部,因?yàn)閯?chuàng)建一個(gè)實(shí)例后再調(diào)用會(huì)繼續(xù)使用這個(gè)實(shí)例,loading的名字就變了

例:

圖片發(fā)自簡(jiǎn)書App

在每個(gè)需要變樣式的請(qǐng)求前面加上這個(gè)即可

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腻豌,一起剝皮案震驚了整個(gè)濱河市家坎,隨后出現(xiàn)的幾起案子嘱能,更是在濱河造成了極大的恐慌,老刑警劉巖虱疏,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惹骂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡做瞪,警方通過查閱死者的電腦和手機(jī)对粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來装蓬,“玉大人著拭,你說我怎么就攤上這事‰怪悖” “怎么了儡遮?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)暗赶。 經(jīng)常有香客問我鄙币,道長(zhǎng),這世上最難降的妖魔是什么蹂随? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任十嘿,我火速辦了婚禮,結(jié)果婚禮上岳锁,老公的妹妹穿的比我還像新娘绩衷。我一直安慰自己,他們只是感情好激率,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布咳燕。 她就那樣靜靜地躺著,像睡著了一般柱搜。 火紅的嫁衣襯著肌膚如雪迟郎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天聪蘸,我揣著相機(jī)與錄音宪肖,去河邊找鬼。 笑死健爬,一個(gè)胖子當(dāng)著我的面吹牛控乾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娜遵,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蜕衡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了设拟?” 一聲冷哼從身側(cè)響起慨仿,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤久脯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镰吆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帘撰,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年万皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摧找。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牢硅,死狀恐怖蹬耘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情减余,我是刑警寧澤综苔,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站佳励,受9級(jí)特大地震影響休里,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赃承,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悴侵。 院中可真熱鬧瞧剖,春花似錦、人聲如沸可免。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇借。三九已至捉撮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妇垢,已是汗流浹背巾遭。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闯估,地道東北人灼舍。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涨薪,于是被迫代替她去往敵國(guó)和親骑素。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容