Vuex actionの処理でaxiosでajaxを行う
Vue.js axiosをajaxライブラリとして導入するでVue.jsにaxiosを導入しました。
今回は、Vuexのactionでaxiosのライブラリを使ったajaxの処理を行います。
データの作成
最初にajaxで読み込むサンプルファイルを作成します。実際はサーバーにアクセスしてSQLなどでデータを取得すると思いますが、ここではjsonファイルを用意して、固定のデータを返すようにします。
ここに、jsonフォルダを作成し、その中にusers.jsonファイルを作成します。
users.json{
"users": [
{
"id": 1,
"name": "一郎",
"age": 20
},
{
"id": 2,
"name": "二郎",
"age": 19
},
{
"id": 3,
"name": "三郎",
"age": 18
}
]
}publicフォルダは以下のようになります。
- js
- app.js
- json
- users.json
- index.html
actionの実装
actions.jsファイルを以下のように実装します。
webpack モジュールのパスを絶対パスで指定する方法で紹介した方法でImportは絶対パスで指定しています。
actions.jsimport Vue from 'vue';
import * as types from 'js/store/mutation-types';
export const getUsers = ({ commit }) => {
Vue.http.get('json/users.json').then((response) => {
// 成功
commit(types.SET_USER, response);
}, (response) => {
// エラー処理
});
};commitでmutationをコールします。
処理の流れは、http(axios)でajaxアクセス→成功時はSET_USERのmutationをコール→SET_USERでstoreに取得したユーザの値をセットとなります。(エラー時の処理は省略しています。)
mutationの実装
SET_USERのmutationを実装します。まずはmutation-typesにSET_USERを追加します。
mutation-types.jsexport const SET_USER = 'SET_USER';次に、mutationを実装します。stateにusersの配列を定義しておきます。
SET_USERで、レスポンスの値(actionのajaxで取得した値)をstate.usersにセットします。
mutations.jsimport * as types from 'js/store/mutation-types';
export const state = {
message: 'hello vuex',
users: []
};
export const mutations = {
[types.MESSAGE_UPDATE] (state) {
state.message = 'hello mutation';
},
[types.SET_USER] (state, response) {
state.users = response.data.users;
}
};コンポーネントの編集
ユーザ一覧(state.users)を表示するために、App.vueのコンポーネントを修正します。
mapMutationsやmapStateと同じように、mapActionsでコンポーネントからactionを参照できます。
App.vue(template)<template>
<div>
<input type="button" value="ユーザ取得" @click="getUsers()">
<div v-for="user in users">
ID: {{ user.id }} 名前: {{ user.name }} 年齢: {{ user.age }}
</div>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { MESSAGE_UPDATE } from 'js/store/mutation-types';
export default {
computed: {
...mapState({
users: 'users'
})
},
methods: {
...mapActions({
getUsers: 'getUsers'
})
}
};
</script>実行
ユーザー取得ボタンクリックでgetUsersのアクションを実行し、ユーザを取得して、ユーザの一覧が画面に表示されます。
実際にはactionでのajaxの処理中はローディングアイコンなどを表示させます。
Vuex actionでローディングアイコンを表示するでその方法を紹介します。