Next.js의 useStorage-Custom 후크
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;
간략한 설명
getStorage
와 setStorage
데이터를 담당하는 2개의 함수getting and parsing
와 setting 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.
읽어 주셔서 감사합니다!
Reference
이 문제에 관하여(Next.js의 useStorage-Custom 후크), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/danielbellmas/custom-usestorage-hook-in-nextjs-382b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)