0Pricing
React Academy · レッスン

Persist MiddlewareによるStateの永続化

persist middlewareを使って、ZustandのstateをlocalStorageまたはsessionStorageと同期します。

「Persist MiddlewareによるStateの永続化」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、Zustandのpersistミドルウェアを使用してストアの状態をlocalStorageと自動的に同期し、ページを再読み込みしても状態が保持されるようにします。

状態を永続化する理由

永続化しない場合、ユーザーがページを更新するとストアの状態はすべてリセットされます。カートの商品、ユーザー設定、UIの状態(開いているパネル)などをlocalStorageに永続化すると、セッションをまたいでシームレスな体験を提供できます。

persistミドルウェア

create()の呼び出しをpersist()でラップします。一意のストレージキーを指定します。Zustandはマウント時にlocalStorageから自動的に読み込み、状態が変化するたびに書き込みます。
import { create } from 'zustand';
import { persist } from 'zustand/middleware';

const useCartStore = create(
  persist(
    (set) => ({
      items: [],
      addItem: (item) => set(s => ({ items: [...s.items, item] })),
    }),
    { name: 'cart-storage' } // localStorage key
  )
);

partializeによる部分的な永続化

`partialize`を使用すると、ストアの特定のスライスだけを永続化できます。これにより、ローディングフラグなどの一時的なデータをlocalStorageから除外できます。
persist(
  (set) => ({ user: null, token: null, loading: false, fetch: () => {} }),
  {
    name: 'auth-storage',
    partialize: (state) => ({ user: state.user, token: state.token }),
    // loading and fetch are NOT persisted
  }
)

sessionStorageの使用

ブラウザーのセッション中だけ永続化する(タブを閉じると消去する)には、ストレージオプションとして`createJSONStorage(() => sessionStorage)`を渡します。
import { createJSONStorage } from 'zustand/middleware';

persist(storeCreator, {
  name: 'session-data',
  storage: createJSONStorage(() => sessionStorage),
})

バージョン管理とマイグレーション

ストアの構造が変わった場合(新しいフィールドやキー名の変更など)は、`version`番号を設定し、古い永続化データを更新するmigrate関数を指定します。
persist(storeCreator, {
  name: 'my-store',
  version: 2,
  migrate: (persistedState, version) => {
    if (version === 1) {
      return { ...persistedState, newField: 'default' };
    }
    return persistedState;
  },
})

ハイドレーションとSSR

サーバー(Next.js)にはlocalStorageが存在しません。Zustandのpersistミドルウェアはこの状況を適切に処理します。サーバーではハイドレーションをスキップし、マウント後にクライアントで再ハイドレーションします。

onRehydrateStorageコールバック

ストアがストレージから復元されたときにコードを実行するには、`onRehydrateStorage`を使用します。トークンの復元後にAPI呼び出しを開始する場合などに役立ちます。
persist(storeCreator, {
  name: 'auth',
  onRehydrateStorage: () => (state) => {
    if (state?.token) state.fetchUser();
  },
})

永続化された状態の消去

`useMyStore.persist.clearStorage()`を呼び出すと、localStorageから永続化されたデータを削除できます。ログアウト処理などに役立ちます。
const handleLogout = () => {
  useAuthStore.persist.clearStorage();
  useAuthStore.setState({ user: null, token: null });
};

ストレージ容量の制限

localStorageの容量はオリジンごとに5〜10 MBに制限されています。大規模なデータセット(完全な商品カタログなど)の永続化は避けてください。識別子や小さな設定オブジェクトだけを永続化します。

確認問題

persistミドルウェアで、特定の状態フィールドをlocalStorageへの保存から除外できるオプションは何ですか?

まとめ

Zustandストアをpersist()でラップし、nameキーを指定します。partializeを使用して関連するスライスだけを保存します。ストアの構造が変わった場合は、バージョンを設定してマイグレーションします。ログアウト時にはclearStorage()を使用します。

次のレッスン

次のレッスン: **Zustand DevToolsとストアのテスト** — Redux DevToolsに接続し、Zustandアクションのユニットテストを記述します。

よくある質問

「Persist MiddlewareによるStateの永続化」レッスンは無料ですか?

はい。「Persist MiddlewareによるStateの永続化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Persist MiddlewareによるStateの永続化」で何を学びますか?

persist middlewareを使って、ZustandのstateをlocalStorageまたはsessionStorageと同期します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Persist MiddlewareによるStateの永続化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 最初のZustand Storeを作成する
  2. Selectorsと不要な再レンダーの防止
  3. Persist MiddlewareによるStateの永続化
  4. Zustand DevToolsとStoreのテスト
← React Academyに戻る