🧠

Vueの状態共有と状態管理の比較ガイド

に公開

Vue 状態共有と状態管理の比較ガイド

Vueにおける状態の受け渡し方法と、状態管理ツール(Vuex・Pinia)の違いについて簡潔にまとめたガイドです。


1. Vueにおける状態共有の方法

1. Props

  • 親 → 子 コンポーネントへのデータ受け渡しに使用
  • コンポーネント階層が深くなると面倒
  • 明示的に階層を辿って渡す必要がある

2. Provide / Inject

  • 祖先 → 子孫 コンポーネントに直接データを渡す
  • 中間コンポーネントを経由せずに共有できる
  • Vue公式では、一般的な状態管理には非推奨

3. Store(グローバル状態管理)

  • アプリ全体で状態を共有・管理するための手法
  • 主に Vuex または Pinia を使用
  • モジュール化や状態追跡、チーム開発に便利
  • 状態の変更は mutation や action 経由で行う

2. Vuex vs Pinia 比較表

項目 Vuex Pinia
リリース時期 Vue 2時代 Vue 3以降
公式性 Vue公式の管理ツール Vue 3公式推奨の管理ツール
文法の複雑さ 高い(mutation/action 必須) 低い(Composition APIベース)
状態変更方法 mutation のみ action で直接変更可能
TypeScript対応 弱い(設定が複雑) 完全対応(自動型推論あり)
構成 複雑(storeフォルダ分離) シンプル(defineStoreで定義)
Devtools連携 あり よりスムーズかつ直感的

💡 コード例

Pinia の例

import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++
    }
  }
})

Vuex の例

import Vuex from 'vuex'

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    increment(context) {
      context.commit('increment')
    }
  }
})

結論

  • Vue 2 プロジェクト → Vuex 継続利用可能
  • Vue 3 以降の新規開発 → Pinia 強く推奨!
  • より簡潔で保守性が高く、型安全・開発効率が良い

Discussion