Vuex は Vue.js アプリケーションのための 状態管理パターン + ライブラリです。
Vuex とは何か? | Vuex
Vuexは上記の様にVue.jsで作成したプログラム中の状態管理を担うライブラリです。乱暴な言い方をするとVuexは管理しやすいグローバル変数を提供してくれます。Vuexのやることはコードと合わせてを見るとわかりやすいです。
// Vuexのストア(状態管理定義)の記述 export const HogeStore:Module<any, any> = { // 管理する状態。グローバル変数の本体的なモノ。 // これを好き勝手弄らせないが、どこからでも参照できるようにする。 state: { foo: [], bar: false, }, // 管理する状態を直接弄ることのできる関数群。ここにある記述以外ではstateを変更できない。 // store等を介して、commit()関数で呼び出してのみ実行される。 // 下記の様に思いっきり抽象化すると扱いやすい。 mutations: { setFoo(state, newFoo){// state.fooを変更する state.foo = newFoo; } }, // 具体的なcommitの内容を記述する。 // コンポーネント中でstore.dispatch(アクション名)とやると直接commitするより安全安心。 actions: { setFoo(context, newFoo){// state.fooを変更する.mutationsと名前がかぶってもOK context.commit('setFoo', newFoo); }, pushFoo(context, newFoo){// state.fooに追記的な context.commit('setFoo', newFoo); }, async resetFoo(context){// state.fooをAPI等のリポジトリから取得して改めてセット const newFoo = await FooRepository.get(); context.commit('setFoo', newFoo); } } }
// コンポーネント側の記述 // 参照の際には算術プロパティを利用すると便利 computed: { foo: { get() { return store.state.HogeStore.foo; }, set(newFoo) { store.dispatch('setFoo', newFoo); }, }, }, methods: { async reset() { await store.dispatch('resetFoo');// dispatch('アクション名')でactions中のメソッドを呼び出す } }
公式を読むともっと多彩なことができますが、とりあえず上記のだけでも十分に機能を発揮します。setterが厳格でgetterが自由なグローバル変数な印象を受けました。getterは追記できるため同じリソースを多角的に読みたい際も複雑さがそれほど増しません。
Vuexを用いるタイミングですが、コンポーネント間のemitが長大になる時でしょう。例えば、あるコンポーネント群(メニューとか検索ボックス)はリソースを取得、あるコンポーネント群(表とかグラフとか)はリソースを表示、あるコンポーネント群(編集モーダルとか)はリソースを加工、とかやりだすと値の変更を4つ5つ越しのコンポーネントに伝播させる必要が出たり、その伝播のルートが3つ股4つ股になったりと煩雑になります。Vuex抜きにこれを整理しようとすると各コンポーネント群の重心であるメインコンポーネント(コンポーネントを呼び出すコンポーネント。App.vueとかPages/Fuga.vueとか)の中に処理が集中しだします。こうなるとメインコンポーネントのやっていることがまさしくVuexのやるべきことになります。
Vuexはコンポーネント間の依存が直列や一方向の様な整然とした場合は不要ですが、そうでない時は値のやりとり最低限になりすっきりします。また純粋なTypeScriptで記述ができるため動作を明確にしやすいです。先述の例の様にVueアプリが複雑な場合、どこかしらでVuexの役割を既に担おうとしている部分があります。ソースコードが複雑化し、もうどうにもならない時はいっそ後付けでVuexを追加する良いです。