nextjs
zustand 상태관리에서 localStorage 사용하는 방법

zustand 상태관리에서 localStorage 사용하는 방법

상태 변수 값을 localStorage에 저장하는 방법

zustandStore.tsx
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
 
interface SettingConfigState {
    useMic: boolean;
    useCamera: boolean;
    toggleMic: () => void;
    toggleCamera: () => void;
}
 
const storeKey = "setting-config-store";
 
export const useSettingConfigStore = create<SettingConfigState>()(
    persist((set) => ({
        useMic: true,
        useCamera: true,
        toggleMic: () => set((state) => ({ useMic: !state.useMic })),
        toggleCamera: () => set((state) => ({ useCamera: !state.useCamera })),
    }), { name: storeKey })
)
 
// window의 'storage' 이벤트를 감지하는 리스너
// A, B, C 세개의 탭이 있을 때 A탭에서 변경한 값이 B탭 에도 반영되게 하기 위한 코드
// 만약 A에서 값을 바꿨을 때 persist() 로 인하여 localStorage에 저장될거고, 이러면 storage 이벤트가 발생할 텐대 이걸 감지해서 값 갱신
if (typeof window !== 'undefined') {
    window.addEventListener('storage', (event) => {
        // 변경된 localStorage의 키가 우리 스토어의 키와 같은지 확인
        if (event.key === storeKey) {
            // 다른 탭에서 변경된 새로운 상태를 파싱
            const newState = JSON.parse(event.newValue || '{}');
 
            // 현재 탭의 스토어 상태를 새로운 상태로 강제 업데이트
            useSettingConfigStore.setState(newState.state);
        }
    });
}
store쓰는쪽.tsx
const useMic = useSettingConfigStore((state) => state.useMic);
const useCamera = useSettingConfigStore((state) => state.useCamera);
 
const { toggleMic, toggleCamera } = useSettingConfigStore();