zukucode
主にWEB関連の情報を技術メモとして発信しています。

Vuex actionの処理でaxiosでajaxを行う

Vue.js axiosをajaxライブラリとして導入するVue.jsaxiosを導入しました。

今回は、Vuexactionaxiosのライブラリを使った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) => {
    // エラー処理
  });
};

commitmutationをコールします。

処理の流れは、http(axios)ajaxアクセス→成功時はSET_USERmutationをコール→SET_USERstoreに取得したユーザの値をセットとなります。(エラー時の処理は省略しています。)

mutationの実装

SET_USERmutationを実装します。まずはmutation-typesSET_USERを追加します。

mutation-types.js
export const SET_USER = 'SET_USER';

次に、mutationを実装します。stateusersの配列を定義しておきます。

SET_USERで、レスポンスの値(actionajaxで取得した値)を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のコンポーネントを修正します。

mapMutationsmapStateと同じように、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でローディングアイコンを表示するでその方法を紹介します。


関連記事

  • Vuexとaxiosを連携する

    ajaxの処理が増えるたびに同じmutationを実行するように処理を入れるのは大変なので、axiosの処理でmutationを実行するようにします。axiosにはinterceptorsという機能が...


  • Vuex actionでローディングアイコンを表示する

    actionでajaxを行うときにローディングアイコンを表示させます。Vuexのstoreにloadingの状態を持つようにします。また、mutationでloadingの状態を変更でするようにします...


  • Vuex actionの処理でaxiosでajaxを行う

    Vuexのactionでaxiosのライブラリを使ったajaxの処理を行います。処理の流れとして、http(axios)でajaxアクセスを行い、成功時はmutationをコールして、storeに取得...


  • Vue.js axiosをajaxライブラリとして導入する

    Vue.jsではajaxまわりの処理は用意されておらず、外部のライブラリを各自で自由に用意するようになっています。axiosの設定用にhttp.jsというファイルを作成します。エントリポイントのapp...


  • async/awaitでajax(axios)処理のエラー時の処理を考える

    async,awaitを使った非同期処理(特にajax処理)の実装でエラー時の処理をどのように実装したらいいか、いろいろと調べてみました。バリデーションエラーなどの処理をcatch処理で実装するのは違...


  • Vuex mutationでstateの値を変更する

    stateはmutationの処理でしか変更できません。コンポーネントからmutationを実行し、stateの値を更新する方法を紹介します。mutationを作成するにあたって、最初にmutatio...


  • Vuex moduleに定義したstateをコンポーネントで簡単に取得する

    Vuexのモジュールに定義したstateを各コンポーネントで参照する方法を紹介します。各コンポーネントではthis.$store.state.モジュール名で各moduleで定義したstateを取得でき...


  • Vuex actionでの非同期処理をasync/awaitの実装をする

    Vuexのactionではajaxなどの非同期処理を実装しますが、非同期処理をasync,awaitで実装する方法を紹介します。特別な制御はいりません。ファンクションを定義する箇所にasyncを追加し...


  • Vue.jsにVuexを導入する

    Vuexを導入する手順の作業メモです。Vuexを利用することにより、各コンポーネントで保持していたデータをstateにまとめられるので、ある程度規模が大きくなっても耐えられるプログラムを作成できます。...


  • Vuex stateを作成して各コンポーネントで参照する

    実際にstoreを作成して、各コンポーネントでその値を参照できるようにします。mutations.jsにstateのオブジェクトを定義します。stateがアプリケーション全体の状態を管理します。