【Vue.js】Pinia × LocalStorageで永続的な状態管理を行う方法

【Vue.js】Pinia × LocalStorageで永続的な状態管理を行う方法 Vue.js

Vue.jsにおける状態管理ライブラリとしてPiniaは非常にシンプルかつ強力です。しかし、通常の状態管理はリロードやタブを閉じた際にリセットされてしまうため、LocalStorageなどを併用して「永続化」することで、より実用的なデータ保持が可能になります。本記事では、PiniaとLocalStorageを組み合わせて、状態を永続的に管理する方法を紹介します。

Piniaでの基本的な状態管理

まず、Piniaストアを作成します。以下はユーザー名を保持するシンプルな例です。

// stores/user.js
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    username: '',
  }),
  actions: {
    setUsername(name) {
      this.username = name;
    },
  },
});

LocalStorageと連携して永続化する方法

状態の保存と復元には、Piniaの`subscribe`メソッドを使って、状態が変更されるたびにLocalStorageへ書き込みます。初期化時にはLocalStorageからデータを読み取ってストアに反映します。

main.jsで永続化ロジックを追加

// main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
import { useUserStore } from './stores/user';

const app = createApp(App);
const pinia = createPinia();
app.use(pinia);

// ストア初期化後にLocalStorageから復元
const userStore = useUserStore();

const savedData = localStorage.getItem('user');
if (savedData) {
  const parsed = JSON.parse(savedData);
  userStore.$patch(parsed);
}

// ストアの変更をLocalStorageに保存
userStore.$subscribe((mutation, state) => {
  localStorage.setItem('user', JSON.stringify(state));
});

app.mount('#app');

動作確認:データが永続化される

ユーザー名をフォームから設定し、ブラウザをリロードしても値が保持されていれば成功です。アプリケーションが終了してもデータが保持され、再読み込み時に即時反映されます。

セキュリティと注意点

LocalStorageに保存するデータは平文のJSON形式です。認証情報や機密データは保存しないように注意してください。また、容量制限(約5MB)や異なるドメインでのアクセス制限もあるため、用途に応じてIndexedDBなどとの使い分けも検討しましょう。

まとめ

PiniaとLocalStorageを組み合わせることで、状態の永続化が手軽に実現できます。セッションの維持やUI設定の保存、ログイン状態の記憶などに活用でき、VueアプリのUX向上につながります。中〜大規模アプリでも同様の仕組みを使うことで、柔軟で再利用性の高い状態管理が可能になります。