【Vuex】基本的な使い方

Vuexで状態管理を行う。

インストール

% yarn add vuex

Vuexを設定

Vuexの内容 - state: $storeで参照できるグローバル変数のようなもの - getters: storeの算出プロパティのようなもの - mutations: stateの値を変更する関数 - actions: mutationsの処理を非同期的に行う

// store.js
import Vue from 'vue';
import Vuex from 'vuex';
 
Vue.use(Vuex); // useはプラグインを使う宣言
 
// Vuexの中身をvue.jsに適用させる
export default new Vuex({ 
    state: {  
        count: 2
    },
    getters: { 
        doubleCount: state => state.count * 2
        // 唯一のstatementがreturnである時アロー関数を使えば省略できる
    },
    mutations: { // この中でのみstateの値を変えられる
        increment(state, number) {
            state.count += number
        }
    },
    actions: { 
        sync(context, number) {
            context.commit('increment', number);
        },
        async(context) {
            setTimeout(() => {...}, 1000);
        }
    }
});

VuexをVueに適用させる

import store from './store.js';
 
new Vue ({
    store: store, // 全てのコンポーネントで$storeが使えるようになる
    router: router,
    render: h=>h(App)
}).$mount('#App');

ストアしたデータをコンポーネントから参照する

computed: {
    count() {
        return this.$store.state.count;  // stateを参照
    },
    doubleCount() {
        return this.$store.getters.doubleCount;  // gettersを参照
    },

コンポーネントからデータをストアする

methods: {
    increment() {
        this.$store.commit('increment', 2);
        // 第一引数にmutationsの関数 第二引数にストアするデータ
    },
    sync() {
        this.$store.dispatch('sync', 2);
        // コンポーネントからはcommitはしない(全てactionsを通す)というのもアリ
        // 一つでも非同期処理があったら全部dispatchにしちゃうとか
    }
}

Vuexにおける全体的なデータの流れ

Components
↓ this.$store.dispatch();  直でcommitでもいい
Actions
↓ commit();
Mutations
↓ stateの値を変更
State
↓ stateの値を取得
Getters