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.js
import 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.js
export const SET_USER = 'SET_USER';
次に、mutation
を実装します。state
にusers
の配列を定義しておきます。
SET_USER
で、レスポンスの値(action
のajax
で取得した値)をstate.users
にセットします。
mutations.js
import * 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でローディングアイコンを表示するでその方法を紹介します。