Vue 3の公式状態管理ライブラリとしてPiniaが採用され、従来のVuexに代わる新たな標準となりました。PiniaはAPIがシンプルで、TypeScriptとの親和性も高く、Composition APIと自然に統合できる設計になっています。本記事では、Piniaの基本的な使い方と、Vuexとの違いや移行時のポイントを紹介します。
Piniaとは?
PiniaはVue.js公式の状態管理ライブラリで、Vuexの後継として位置づけられています。以下のような特徴があります。
- ボイラープレートが少なくシンプルな構文
- TypeScript対応が容易
- Composition APIとの統一的な使い方
- Vue DevToolsによる状態確認も可能
Piniaのインストールとセットアップ
まず、Vue CLIまたはViteプロジェクトにPiniaをインストールします。
npm install pinia
次に、main.js(またはmain.ts)でPiniaをVueアプリに登録します。
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const app = createApp(App)
app.use(createPinia())
app.mount('#app')
基本的なストアの作成方法
ストアは、PiniaのdefineStore
関数を使って定義します。以下はカウンター用ストアの例です。
// stores/counter.js
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++
}
}
})
ストアID(例:’counter’)は、開発ツールや永続化プラグインで使われます。
ストアの使用方法
コンポーネント内でストアを使うには、`setup()`関数の中で呼び出します。
<script setup>
import { useCounterStore } from './stores/counter'
const counter = useCounterStore()
</script>
<template>
<div>
<p>カウント: {{ counter.count }}</p>
<button @click="counter.increment">増やす</button>
</div>
</template>
Vuexとの主な違い
比較項目 | Vuex | Pinia |
---|---|---|
記述スタイル | Options API中心(mutations, actions) | Composition APIベース(actionsのみ) |
TypeScript対応 | 手動型定義が必要 | 型推論に対応 |
コード量 | ボイラープレートが多い | 少なくシンプル |
VuexからPiniaへの移行ポイント
- mutationsは不要。すべて
actions
に統合 - モジュールごとの分割は、
defineStore
で複数定義 - 型が自動推論されるため、記述量が減る
少しずつ移行する場合は、VuexとPiniaを同時に併用することも可能です。
まとめ
PiniaはVue 3時代の標準的な状態管理ライブラリとして、シンプルかつ柔軟にアプリケーションの状態を管理できます。Vuexに比べて構文が簡潔で学習コストも低いため、新規プロジェクトや段階的なリプレースに最適です。これからVueアプリを構築する方は、Piniaの導入をぜひ検討してみてください。