Vuex actionでローディングアイコンを表示する
Vuex actionの処理でaxiosでajaxを行うでaction
の処理を実装しました。
action
でajax
を行うときにローディングアイコンを表示させます。
mutationの編集
Vuex
のstore
にloading
の状態を持つようにします。また、mutation
でloading
の状態を変更でするようにします。
mutation-types.js
export const SET_LOADING = 'SET_LOADING';
mutations.js
export const state = {
loading: false
};
export const mutations = {
[types.SET_LOADING] (state, isLoading) {
state.loading = isLoading;
}
};
コンポーネントの編集
コンポーネントでloading
がtrue
のときだけロード中のメッセージを表示するようにします。
App.vue
<template>
<div>
<div v-if="loading">
ロード中
</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
export default {
computed: {
...mapState({
loading: 'loading'
})
}
};
</script>
actionの編集
action
の最初でloading
をtrue
にするmutation
を実行し、最後でloading
をfalse
にするmutation
を実行します。
webpack モジュールのパスを絶対パスで指定する方法で紹介した方法でImport
は絶対パスで指定しています。
actions.js
import Vue from 'vue';
import * as types from 'js/store/mutation-types';
export const getUsers = ({ commit }) => {
commit(types.SET_LOADING, true);
Vue.http.get('json/users.json').then((response) => {
commit(types.SET_LOADING, false);
// 成功
commit(types.SET_USER, response);
}, (response) => {
commit(types.SET_LOADING, false);
// エラー処理
});
};
axiosの共通処理に組み込む
規模が小さい場合は上記の方法でも問題ありませんが、ajax
処理が増えるたびにloading
のmutation
を組み込むのは手間なので、axios
の処理で共通化ができれば簡単になります。
Vuexとaxiosを連携するでその方法を紹介します。