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

Vuex mutationでstateの値を変更する

Vuex stateを作成して各コンポーネントで参照するstateを作成して各コンポーネントで参照できるようになりました。

statemutationの処理でしか変更できません。コンポーネントからmutationを実行し、stateの値を更新する方法を紹介します。

mutation-typesの作成

mutationを作成するにあたって、最初にmutation-typesを作成します。

以下のようなファイルを作成します。

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

変数名と同じ文字列を定義したconstの変数を定義します。

mutationをコールするとき、mutationの指定は文字列で行います。文字列をconstで定義しておけばmutationの宣言やコールを全て定義したconst変数で行えるため、コーディングミスが減り、保守性も上がります。

mutationの作成

mutations.jsファイルにmutationの処理を作成します。store.messageの内容を変更するmutationです。

第一引数はstateとなるため、引数が必要な場合は第2引数に定義します。

mutations.js
import * as types from 'js/store/mutation-types'; //mutation-typesをImportします

export const state = {
  message: 'hello vuex'
};

export const mutations = {
  [types.MESSAGE_UPDATE] (state) {
    state.message = 'hello mutation';
  },
  // 引数が必要な場合は第2引数に定義します
  [types.FOO] (state, payload) {
    state.message = payload.message;
  },
  // このような方法もよく見かけます(機能はFOOと同じです)
  [types.BAR] (state, { message }) {
    state.message = message;
  }
};

[変数名]でファンクション名を変数で定義できます。

コンポーネントからmutationをコール

template

ボタンを配置し、クリックするとmutationをコールするファンクションを実行するようにします。

App.vue
<template>
  <div>
    <div class="message">
      {{ message }}
    </div>
    <input type="button" value="更新" @click="update()">
  </div>
</template>

script

更新ボタンクリックで呼ばれるファンクションupdateを定義します。その中でmutationをコールします。

mapState同じようにmapMutationsmutationを参照できるようになります。スプレッド演算子やmutation-typesによって、コードがかなりシンプルになります。

App.vue
<script>
import { mapState, mapMutations } from 'vuex';
import { MESSAGE_UPDATE } from 'js/store/mutation-types';

export default {
  computed: {
    ...mapState({
      message: 'message'
    })
  },
  methods: {
    ...mapMutations({
      MESSAGE_UPDATE
    }),
    update () {
      this.MESSAGE_UPDATE(); // mutationをコールします
    }
  }
};
</script>

実行

更新ボタンをクリックするとメッセージがhello mutationに変更されます。

ここで注目したいのが、mutationではstateを変更しただけで、再描画の処理を行っていないことです。

Vuexに限らず、Vue.jsではcomputedに定義した値は、変更されると自動的に画面の更新もおこなってくれるので、stateの内容と画面の内容で同期が取れていることになります。

Vuexを導入することにより、Vue.jsの機能の恩恵をさらに受けられます。


関連記事

  • Vuex 厳格(strict)モードでエラーになるよくある原因

    Vuexの厳格(strict)モードでエラーになってしまう原因でよくあるパターンです。stateに格納した配列をソートして表示するときに、stateの値をcomputedやgettersでそのままソー...


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

    Vue.jsにVuexを導入するでVuexの導入が完了しました。実際にstoreを作成して、各コンポーネントでその値を参照できるようにします。最初にstoreを作成します。mutations.jsにs...


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

    Vuexのモジュールに定義したstateを各コンポーネントで参照する方法を紹介します。以下のようにmoduleが定義されているとします。各コンポーネントではthis.$store.state.モジュー...


  • Vuexとaxiosを連携する

    Vuex actionでローディングアイコンを表示するで、actionの処理でローディングの表示非表示を制御するmutationを実行するようにしました。ajaxの処理が増えるたびに同じmutatio...


  • Vuex モジュールのactionの処理で別モジュールのactionをコールする

    Vuexのモジュール内のactionの処理で別モジュールのactionをコールする方法を紹介します。ルートのactionの場合、moduleで定義したactionをコールする場合は、以下のようにモジュ...


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

    Vuex actionの処理でaxiosでajaxを行うでactionの処理を実装しました。actionでajaxを行うときにローディングアイコンを表示させます。Vuexのstoreにloadingの...


  • Vuex actionの処理で別のactionをコールする

    Vuexのactionの処理で別のactionをコールする方法を紹介します。第一引数のcontextを受取り、dispatchメソッドをコールします。dispatchメソッドの第一引数はコールしたいa...


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

    Vue.js axiosをajaxライブラリとして導入するでVue.jsにaxiosを導入しました。今回は、Vuexのactionでaxiosのライブラリを使ったajaxの処理を行います。最初にaja...


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

    Vuexのactionではajaxなどの非同期処理を実装しますが、非同期処理をasync,awaitで実装する方法を紹介します。ファンクションを定義する箇所にasyncを追加しておけば普通にawait...


  • Vue.jsにVuexを導入する

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