Vuex mutationでstateの値を変更する
Vuex stateを作成して各コンポーネントで参照するでstateを作成して各コンポーネントで参照できるようになりました。
stateはmutationの処理でしか変更できません。コンポーネントからmutationを実行し、stateの値を更新する方法を紹介します。
mutation-typesの作成
mutationを作成するにあたって、最初にmutation-typesを作成します。
以下のようなファイルを作成します。
mutation-types.jsexport const MESSAGE_UPDATE = 'MESSAGE_UPDATE';変数名と同じ文字列を定義したconstの変数を定義します。
mutationをコールするとき、mutationの指定は文字列で行います。文字列をconstで定義しておけばmutationの宣言やコールを全て定義したconst変数で行えるため、コーディングミスが減り、保守性も上がります。
mutationの作成
mutations.jsファイルにmutationの処理を作成します。store.messageの内容を変更するmutationです。
第一引数はstateとなるため、引数が必要な場合は第2引数に定義します。
mutations.jsimport * 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同じようにmapMutationsでmutationを参照できるようになります。スプレッド演算子や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の機能の恩恵をさらに受けられます。