Vue 的 axios 全域攔截器
本篇運用到 Vue Cli 以及 Vuex
以六角學院的 Vue 最終作業來說用到攔截器是為了搭配 Vue Loading Overlay 這個套件,平常在寫時執行每個 API 都會帶一次
true和false,用攔截器的好處是可以省去API 數量 * 2行的程式碼,如果 API 有 50 個這樣就可以省去 100 行的狀態控制程式碼,並且也不用煩惱在製作測試時狀態控制碼有沒有被關好。
起手式
安裝 vue-axios
1  | npm install --save axios vue-axios  | 
main.js 寫入
1  | import Vue from 'vue'  | 
安裝 vue-loading-overlay
1  | npm install vue-loading-overlay --save  | 
main.js 寫入
1  | import Loading from 'vue-loading-overlay'  | 
基本程式碼
通常我會很乾脆的放到 App.vue 裡面,可以省很多事,反正標題都寫全域了
App.vue
1  | <template>  | 
Vuex 的 store/index.js ,因為待會會用到所以先寫在這裡
1  | import Vue from 'vue'  | 
變數名稱 isLoading ,控制 loading 畫面發動的時機,帶 Boolean : true or false
大部分在寫程式碼的時候會在 axios 請求中帶入 isLoading 的控制碼片段
1  | // methods 中的方法  | 
像這樣的方式來控制 loading 畫面,如同前面所講的一個專案下如果有 50 個 API 要請,那就要寫 100 行控制碼來控制,作業感很重的感覺,下面來開始建立我們的 axios 攔截器吧。
建立攔截器
通常我會在 src 資料夾下面新增一個叫 JS 的資料夾,建立一個 axios.js 檔案,把剛剛在 store/index.js 寫好的狀態控制引進來
1  | import axios from 'axios'  | 
main.js
原本的
1  | import axios from 'axios'  | 
改為
1  | import axios from '@/js/axios'  | 
上面提到的 getTest(); 就可以簡略為
1  | // methods 中的方法  | 
只要是使用 this.axios 發動請求就會自動帶入 loading 的狀態控制囉!
進階 API 管理
當專案 API 越來越多的時候,資料也從各種不同的網域取得時,就會想要把 API 放在同一支檔案裡集中管理,目前是用 export 和 import 的方式處理,在各個 vue 檔或是 store/index.js 我們只要引入變數就可以了。
變數引用
接下來一樣在 js 資料夾新增一個 api.js 的檔案。
寫入
1  | export const getRandomUser = 'https://randomuser.me/api/'  | 
在 vue 檔引入
1  | <script>  | 
簡易的引用就完成了
不同網域的時候
當 API 網域不同時,我就會採用這種方式, axios 提供了自訂義默認值的方法
1  | axios.create({ });  | 
目前我比較常使用 baseURL 和 timeout
1  | axios.create({  | 
綜合前面所使用的攔截器方法,來看完整的 api.js 內容吧
1  | import axios from 'axios';  | 
get API 實際上就等於
1  | axios.get(process.env.VUE_APP_PATH + '/get-user/');  | 
post API 同理
1  | axios.post(process.env.VUE_APP_PATH + '/login/', obj);  | 
vue 檔
把上面兩個變數引入到 vue 檔,就會是變數後面接 .then()
1  | get_user().then((res)=>{ });  | 
1  | <script>  | 
這樣就 OK 哩。
補充
因為接收到請求就會立即執行關閉的狀態控制,
1  | store.commit('Set_Loading', false);  | 
但有時候還有後續的程式碼要跑,使用者如果很急性的話 loading 一結束就按下功能鈕,可能會導致什麼錯誤也說不定,這邊我會再加上 setTimeout 延遲關閉的時間,留個緩衝的時間讓後續的程式碼跑完。
1  | setTimeout(()=>{store.commit('Set_Loading', false)}, 1000);  | 
結語
設定好 axios 攔截器就可以省略掉很多行 loading 狀態控制碼。
做好 API 管理,以後 API 路徑有變動時只要去 .env 修改網域位置或是進到 api.js 修改就 OK 了,就不用再檔案中一個一個去找散落的 API 字串。
參考:https://ykloveyxk.github.io/2017/02/25/axios%E5%85%A8%E6%94%BB%E7%95%A5/
範例 API:https://randomuser.me/