📚 Reference


📜 Chapter


Middlewares

pinia-plugin-persistedstate

localStorage 사용


기본 설정 방법

import { create } from 'zustand';
import { persist } from 'zustand/middleware';

interface UserState {
  isLoggedIn: boolean;
  login: () => void;
  logout: () => void;
}

const useUserStore = create<UserState>()(
  persist(
    (set) => ({
      isLoggedIn: false,
      login: () => set({ isLoggedIn: true }),
      logout: () => set({ isLoggedIn: false }),
    }),
    {
      name: 'user-storage', // 저장소에 쓰일 고유 키 이름
    }
  )
);

저장소 선택 및 부분 저장

{
  name: 'app-storage',
  // 세션 스토리지 사용 시
  storage: createJSONStorage(() => sessionStorage), 
  // isLoggedIn만 저장하고 나머지는 제외하고 싶을 때
  partialize: (state) => ({ isLoggedIn: state.isLoggedIn }),
}

Hydration 문제 해결 (Next.js 또는 SSR 환경)

// 상태가 복구되었는지 확인하는 flag를 두는 방식
const useStore = create(
  persist(
    (set) => ({
      data: [],
      _hasHydrated: false,
      setHasHydrated: (state) => set({ _hasHydrated: state }),
    }),
    {
      name: 'my-store',
      onRehydrateStorage: () => (state) => {
        state?.setHasHydrated(true);
      },
    }
  )
);

버전 관리

{
  name: 'user-storage',
  version: 1, // 버전 번호
  migrate: (persistedState: any, version: number) => {
    if (version === 0) {
      // 구버전 데이터를 신버전 구조로 변환하는 로직
      return { ...persistedState, newField: 'default' };
    }
    return persistedState;
  },
}