Next.js의 useStorage-Custom 후크

Next.js를 사용하는 경우 localStorage(또는 해당 문제에 대한 스토리지)와 어울리지 않는다는 것을 알고 있습니다.
그 이유는 저장소가 전역 개체 windows 아래에 있고 이는 서버의 undefined와 같기 때문에 Next.js에 서버에서 실행할 항목과 클라이언트에서 실행할 항목을 명시적으로 알려야 하기 때문입니다.

먼저 SSR(서버 측 렌더링)에 있는지 여부를 나타내는 유틸리티를 추가했습니다.

export const isSsr = typeof window === 'undefined';


후크 🪝




import { useState, useEffect } from 'react';
import { isSsr } from '@/utils/isSsr';

export const getStorage = (storage, key) => JSON.parse(storage.getItem(key));

export const setStorage = (storage, key, newValue) => storage.setItem(key, JSON.stringify(newValue));

const useStorage = (storageType, key, initialValue) => {
  if (isSsr) return [initialValue];

  const storageName = `${storageType}Storage`;
  const storage = window[storageName];

  const [value, setValue] = useState(getStorage(storage, key) || initialValue);

  useEffect(() => {
    setStorage(storage, key, value);
  }, [value]);

  return [value, setValue];
};

export default useStorage;


간략한 설명


  • 우리는 각각 getStoragesetStorage 데이터를 담당하는 2개의 함수getting and parsingsetting and stringifying를 가지고 있습니다.
  • window 객체를 사용하는 로직을 작성하기 전에 저는 Next.js에게 초기 값을 반환하라고 말했습니다.
  • 값이 변경될 때마다 후크가 선택한 스토리지를 업데이트합니다.

  • 사용하는 방법




    
    const LOCAL_STORAGE_KEY = 'filters';
    const initialStateFilters = { isExpended: true };
    
    const [filters, setFilters] = useStorage('local', LOCAL_STORAGE_KEY, initialStateFilters);
    
    // The value
    const { isExpended } = filters;
    
    // Setting the value
    const handleToggle = newIsExpended => setFilters({ ...filters, isExpended: newIsExpended });
    


    You're maybe wondering why I'm using an object as the value of the data, it is simply for scalability reasons.
    In the future we'll probably want to add more filters, so instead of creating a hook for each one we'll have them all under the same key.



    읽어 주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기