状態管理
Vue.js での状態管理 (State Management) とは、アプリケーションでリアクティブな状態 (ステート) を管理することを言います。
Vue.js 公式ドキュメント 状態管理
複数のコンポーネント間で状態を共有する際、Vue.js ではリアクティビティー API を用いたシンプルな状態管理を行うことができます。
Vue.js 公式ドキュメント リアクティビティー API によるシンプルな状態の管理
しかし、SSR の考慮 にも書かれているように、Nuxt で SSR を行っている場合には いくつかの問題 が起こる可能性があります。
Vue.js の公式ドキュメントでは Pinia と言う状態管理ライブラリを使う方法が紹介されていますが、Nuxt が提供する useState()
コンポーザブルもその解決策の 1 つです。
(もちろん、Nuxt で Pinia を使用する ことも可能です)
useState()
useState() コンポーザブル は SSR フレンドリーな状態管理と、コンポーネント間で状態を共有するためのシンプルな方法を提供します。useState()
は共有状態を定義するための SSR フレンドリーな ref()
です。
前述の通り、Vue.js のリアクティビティー API (e.g. ref()
) を用いてコンポーネントを跨いだ状態管理を SSR で行う場合、いくつかの問題が発生する可能性があります。
そのため、Nuxt では <script setup>
や setup()
関数の 外 では、ref()
での状態を定義せず、代わりに useState()
を使用することがベストプラクティスとされています。
このプレイグラウンドの例では、"count"
をキーに CounterA
コンポーネントと CounterB
コンポーネントで状態を共有しています。CounterA
によってレンダリングされたボタンをクリックしたときに、CounterB
のステートも更新されることに注目してみてください。
より詳細な説明は、Nuxt 公式ドキュメント 状態管理 を参照してください。
useState()
のデータは JSON にシリアライズされるため、クラス、関数、シンボルなど、シリアライズできないものを含まないことに注意が必要です。