Vue.jsでの状態(データ)を一括で管理するためのライブラリ「Vuex」を使ってみます。
今回はVue CLIの環境で、バージョンはそれぞれvue-cliが5.0.4、vue.jsが3.2.36、vuexが4.0.2を使用しています。
サンプルコード
Vue CLIの開発環境でsrc/store/index.jsを開きます。
初期状態は以下のようになっています。
import { createStore } from 'vuex'
export default createStore({
state: {
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})
まずはstateを使ってみます。
stateは状態(データ)を保存する場所で、例としてcountというデータを追加してみます。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 0
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})
実際にstateの中身を確認するため、getterも追加してみます。
getterはstateの値などを取得する際に使用されます。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 0
},
getters: {
getCount(state) {
return state.count;
}
},
mutations: {
},
actions: {
},
modules: {
}
})
これでstateの値を取得する準備ができたので、src/views/HomeView.vueでgetterを使ってみます。
<template>
<div class="home">
<p>{{ count }}</p>
</div>
</template>
<script>
export default {
name: 'HomeView',
computed: {
count() {
return this.$store.getters.getCount;
}
}
}
</script>
this.$store.getters.getCountとすることで取得ができます。
次にstateの値の変更を試してみます。
stateの値の変更はmutationを使って行います。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 0
},
getters: {
getCount(state) {
return state.count;
}
},
mutations: {
countUpdate(state, payload) {
state.count += payload;
}
},
actions: {
},
modules: {
}
})
第二引数(payload)で値を受け取ることができます。
これでmutationを使う準備ができたので、vueファイル内で実際に使ってみます。
ボタンをクリックするとcountが1ずつ増えるようにしてみます。
<template>
<div class="home">
<p>{{ count }}</p>
<button @click="buttonEvent">button</button>
</div>
</template>
mutationを使う際にはstore.commitを使用します。
<script>
export default {
name: 'HomeView',
computed: {
count() {
return this.$store.getters.getCount;
}
},
methods: {
buttonEvent() {
this.$store.commit('countUpdate', 1);
}
}
}
</script>
commitの第一引数にmutationの名前、第二引数に渡す値を設定します。
これでボタンクリック毎にカウントアップするようになりました。
次にactionですが、非同期な処理を含む場合などmutationで行えない処理を行った上で、mutationを使ってstateの変更を行います。
import { createStore } from 'vuex'
export default createStore({
state: {
count: 0
},
getters: {
getCount(state) {
return state.count;
}
},
mutations: {
countUpdate(state, payload) {
state.count += payload;
}
},
actions: {
delayCount(context, payload) {
setTimeout(function() {
context.commit('countUpdate', payload);
}, 3000);
}
},
modules: {
}
})
setTimeout()を使って、一定時間後にstateが変更されるようにしました。
actionはmutationと同様、第二引数(payload)で値を受け取ることができます。
action用のボタンを追加して、動作を確認してみます。
<template>
<div class="home">
<p>{{ count }}</p>
<button @click="buttonEvent">button</button>
<button @click="delayEvent">delay button</button>
</div>
</template>
actionを使う際にはstore.dispatchを使用します。
<script>
export default {
name: 'HomeView',
computed: {
count() {
return this.$store.getters.getCount;
}
},
methods: {
buttonEvent() {
this.$store.commit('countUpdate', 1);
},
delayEvent() {
this.$store.dispatch('delayCount', 1);
}
}
}
</script>
dispatchは第一引数にactionの名前、第二引数に渡す値を設定します。
これでボタンクリック後、3秒経過後にカウントアップされるようになりました。
コメントが承認されるまで時間がかかります。