Vuexとaxiosを連携する
Vuex actionでローディングアイコンを表示するで、action
の処理でローディングの表示非表示を制御するmutation
を実行するようにしました。
ajax
の処理が増えるたびに同じmutation
を実行するように処理を入れるのは大変なので、axios
の処理でmutation
を実行するようにします。
axios
にはinterceptors
という機能があり、リクエストのタイミングとレスポンスのタイミングに処理を組み込むことができます。
なので、そこでmutation
をコールし、ローディングの表示非表示を切り替えれば、各action
で同じ処理を実装しなくてもよくなります。
axiosの修正
Vue.js axiosをajaxライブラリとして導入するで作成したhttp.js
を修正します。
http.js
import axios from 'axios';
import { SET_LOADING } from 'js/store/mutation-types';
const http = axios;
export default (Vue) => {
export default (Vue, { store }) => {
http.interceptors.request.use((config) => {
store.commit(SET_LOADING, true);
return config;
}, (error) => {
// エラー処理
});
http.interceptors.response.use((response) => {
store.commit(SET_LOADING, false);
return response;
}, (error) => {
// エラー処理
});
Vue.http = http;
Object.defineProperties(Vue.prototype, {
$http: {
get () {
return http;
}
}
});
};
エントリポイントの修正
http.js
ではmutation
をコールするためにstore
を参照していますが、今のままではstore
が参照できないため、エントリポイントのapp.js
を修正します。
webpack モジュールのパスを絶対パスで指定する方法で紹介した方法でImport
は絶対パスで指定しています。
app.js
import 'less/app.less';
import Vue from 'vue';
import store from 'js/store';
import http from 'js/http';
import App from 'js/components/App.vue';
Vue.use(http);
Vue.use(http, { store }); //storeを引数に設定する
new Vue({
el: '#app',
store,
render: h => h(App)
});