Vuexの概要と導入のポイント
VuexはVue.js専用の状態管理ライブラリであり、複数のコンポーネント間で共有可能なアプリケーション全体の状態を一元管理するために設計されています。特に中規模から大規模なアプリケーションにおいて、コンポーネント間のデータ共有や状態管理を効率的に行うために有用です。
Vuexのコアコンセプト
- state: アプリケーション全体の状態を保持する
- mutations: 状態を変更するためのメソッド(同期処理のみ)
- actions: 非同期処理を含むロジックを実行し、mutationsを呼び出す
- getters: stateから派生した値を算出する
Vuexストアの作成と構成
Vuexの中心となるのはストア(store)のインスタンスです。以下のようにVueとVuexをインポートした上でストアを生成します。
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
progress: 0,
items: [],
isCompleted: false
},
mutations: {
updateProgress(state, value) {
state.progress = value;
},
completeTask(state) {
state.isCompleted = true;
}
},
actions: {
fetchItems({ commit }) {
// 非同期処理の例
setTimeout(() => {
commit('updateProgress', 100);
commit('completeTask');
}, 1000);
}
},
getters: {
progressPercentage: state => state.progress + '%'
}
});
VueインスタンスへのVuexストアの注入
作成したVuexストアをVueアプリケーションに組み込むには、Vueインスタンス生成時にstoreオプションとして渡します。
import Vue from 'vue';
import App from './App.vue';
import store from './store'; // 別ファイルで定義したストアをインポート
new Vue({
el: '#app',
store, // ストアを注入
render: h => h(App)
});
コンポーネントからのストアアクセス方法
コンポーネント内では、this.$storeを通じてストアにアクセスできます。computedプロパティと組み合わせることで効率的な状態取得が可能です。
computed: {
progressText() {
return this.$store.getters.progressPercentage;
}
},
methods: {
startLoading() {
this.$store.dispatch('fetchItems');
}
}
グローバル状態とローカル状態の使い分け
すべての状態をVuexに置く必要はありません。以下のようなケースではコンポーネントのローカル状態として管理するのが適切です:
- フォームの入力値
- UIの開閉状態(ドロワー、ポップアップなど)
- コンポーネント固有のカウンター
一方で、以下のような共有が必要な状態はVuexに格納すべきです:
- ユーザー認証情報
- アプリケーション全体の設定
- 複数コンポーネント間で参照・更新が必要なデータ