Vuexメモ

Docuemnt
Github

レイヤーである。ロジックをDOMから分離することによってテストがしやすくなる

Usage

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
let store = new Vuex.Store({});
let app = new Vue({
    store,
}).$mount('#app');


state

stateはコンポーネントのcomputed内で下記の形式で利用することができる。

computed: {
    foo() {
        return this.$store.state.foo
    }
}

mapStateを使用すると以下のようにthis.$storeを省略することができる

computed: {
    ...mapState({
        // this.foo()
        foo: state => state.foo,
        foo_1(state) {
            return state.foo + 1;
        }
    })
}


Getter

getterはstateの値を取得するための関数

let store = new Vuex.Store({ 
    state: {
        items: [
            {id: 1, name: "foo"},
            {id: 2, name: "bar"},
        ]
    },
    getters: {
        // moduleではstate,getters,rootState,rootGettersを使用する
        foo : (state, getters) => {
            return state.items.filter(item => item.name == 'foo')[0]
        },
        // 関数を返すgetterを定義することで引数を渡すことができる
        getItemById: (state, getters) => (id) => {
            return state.items.filter(item => item.id == id)[0]
        }
    }
});

store.getters.foo
// {id: 1, name: "foo"}
store.getters.getItemById(2)
// {id: 1, name: "foo"}
computed: {
    ...mapGetters({
        // store.getters.foo => this.foo
        foo: 'foo',
        // store.getters.getItemById(2) => this.getItemById(2)
        getItemById: 'getItemById' 
    })
}


Mutation

Vue.set(state.foo, 'foo', 1); 
state.foo = { ...state.foo, bar: 1 };
state: {
    foo: 1
},
mutations: {
    increment (state, payload) {
        state.foo += payload.foo;
    }
}
methods: {
    ...mapMutations({
        // this.$store.commit('foo', 1)をthis.foo(1)で利用することが可能になる。
        foo: 'foo',
    })
}


Action

actions: {
    foo ({ state, rootState, commit, dispatch, getters, rootGetters }, payload) {
        commit('foo', payload)
    }
}
methods: {
    ...mapActions({
        // this.$store.dispatch('foo', payload) => this.foo(payload)
        foo: 'foo'
    })
}


Module


Vuex.Store *


Vue.jsメモ
VueRouterメモ
cheatsheet
vuelidateメモ