μ¬ν΄λ μμ’μ’ νλ‘μ νΈλ₯Ό μ§ννλ©° κ³ν μ΄μ΄μ μμ±νκΈ° κΈ°λ₯μ λ΄λΉνκ³ , μ΄λ₯Ό useSessionStorage ν μ μ μν΄ κ΅¬ννλ κ³Όμ μ λ΄μ κΈμ λλ€.
κ³ν μμ± νμ΄μ§λ κ³νμ μμ±ν μ μλ νμ΄μ§μ
λλ€. μμ νλμ λ°μ€μμ 보λ―μ΄, κ³ν μμ± κ³Όμ μ μ΄ 4λ¨κ³λ‘ ꡬμ±λμ΄ μμ΅λλ€. /create
λΌλ urlμ κ°μ§λ νλμ νμ΄μ§ μμ μ΄ 4κ°μ λ¨κ³κ° μ§νλ μ μκ³ , κ° λ¨κ³λ₯Ό λνλ΄λ μ»΄ν¬λνΈκ° ν νμ΄μ§ μμμ κ΅μ²΄λλ©΄μ λ λλ§λλ ꡬ쑰μ
λλ€.
μ μ λ μ΄ νμ΄μ§μμ κ³νμ μμ±ν μ μμ΅λλ€. νμ§λ§ κ·Έ λ¨κ³κ° 4λ¨κ³λ λλ λ§νΌ, μ μ κ° μ€κ°μ μ€μ λλ κ³ μλ‘ νμ΄μ§λ₯Ό μ΄νν μ μκΈ° λλ¬Έμ, λ€μ μμ± νμ΄μ§λ‘ λμμμ λ μ΄μ dataλ₯Ό μ¬μ©ν΄ κ³νμ μ΄μ΄μ μμ±ν μ μλ κΈ°λ₯μ΄ νμνλ€κ³ μκ°νμ΅λλ€.
κ³ν μ΄μ΄μ μμ±νκΈ° κΈ°λ₯μ ꡬννκΈ° μν΄μλ, μ μ κ° μ΄μ μ μμ±νλ dataλ₯Ό μ΄λκ°μ μ μ₯ν΄μΌνμ΅λλ€. κ·ΈλμΌμ§λ§ μ μ κ° κ³νμ μ΄μ΄μ μμ±νλ €κ³ ν λ, μ΄μ dataλ₯Ό κ°μ Έμ μ¬μ©ν μ μκΈ° λλ¬Έμ λλ€.
μ ν¬ νμ΄ μ νν μ μ₯μλ μΈμ μ€ν 리μ§μ λλ€. μ¬μ€ λ°μ΄ν°λ₯Ό μλ²μ μ μ₯ν μλ, λ‘컬 μ€ν 리μ§μ μ μ₯ν μλ μμ§λ§ μΈμ μ€ν 리μ§λ₯Ό μ νν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
κ·Έλμ μ»΄ν¬λνΈ λ΄μ μνλ€μ μΈμ μ€ν 리μ§μλ μ μ₯νκ³ μ»΄ν¬λνΈμ μνκ° λ³κ²½λ λλ§λ€ μ΄λ₯Ό μΈμ μ€ν 리μ§μ λκΈ°νμμΌμ£ΌκΈ° μν΄, useSessionStorage ν μ μ μνμμ΅λλ€.
interface SessionStorageProps<T> {
key: string;
initialValue: T;
setSessionValueAtFirst?: boolean;
}
export const useSessionStorage = <T>({ // T: μ μ₯νλ €λ dataμ type
key,
initialValue,
setSessionValueAtFirst = false,
}: SessionStorageProps<T>) => {
const [getItem, setStoredItem] = useState<T>(() => {
if (typeof window !== 'undefined') {
const item = sessionStorage.getItem(key);
if (item) {
// sessionStorageμ κ°μ΄ μλ€λ©΄ κ·Έ κ°μ μ¬μ©
return JSON.parse(item);
} else {
// sessionμ κ°μ΄ μμ λ μ΄κΈ°κ°μΌλ‘ μ¬μ©
if (setSessionValueAtFirst) {
// μ΄κΈ°κ°μ sessionStorageμ μ μ₯
sessionStorage.setItem(key, JSON.stringify(initialValue));
}
return initialValue;
});
const setItem = (value: T) => {
setStoredItem(value); // 1. μ체 state λ³κ²½
sessionStorage.setItem(key, JSON.stringify(value)); // 2. μΈμ
μ€ν λ¦¬μ§ λ΄ data λ³κ²½
};
return [getItem, setItem] as const;
};
useSessionStorage
hookμ κ°λ¨ν μ€λͺ
νμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
stateμ μ΄κΈ°κ°
μΈμ μ€ν 리μ§μ ν΄λΉ keyμ λν dataκ° μ΄λ―Έ μ‘΄μ¬νλ€λ©΄, κ·Έ κ°μ μ΄κΈ°κ°μΌλ‘ μ¬μ©ν©λλ€.
μ΄λ μ μ κ° νμ΄μ§λ₯Ό μ΄νν ν, λ€μ νμ΄μ§μ μ κ·Όνμ λ μΈμ μ€ν 리μ§μ λ¨μμλ dataλ₯Ό κ³μ μ¬μ©ν μ μλλ‘ νκΈ° μν¨μ λλ€.
μΈμ
μ€ν 리μ§μ ν΄λΉ ketμ λν dataκ° μ‘΄μ¬νμ§ μλλ€λ©΄, μΈμλ‘ λ°μ initialValue
λ₯Ό μ΄κΈ°κ°μΌλ‘ μ¬μ©ν©λλ€.
stateμ μ κ·Ό
useSessionStorage
hook λ΄ μ체 state κ°μ λ°νν©λλ€.
stateμ λ³κ²½
useSessionStorage
hook λ΄ μ체 stateλ₯Ό λ³κ²½μμΌμ£Όκ³
μΈμ μ€ν 리μ§μ dataλ λ³κ²½μμΌμ€λλ€.
=> μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈ λ΄ stateμ μΈμ μ€ν λ¦¬μ§ λ΄ dataκ° νμ κ°μ κ°μ μ μ§νλ κ²μ 보μ₯ν μ μμ΅λλ€.
κ²°κ΅ μ΄λ₯Ό μ 리νλ©΄, useState
hookμ ν΅ν΄ μ»΄ν¬λνΈμ stateλ₯Ό κ΄λ¦¬νλ λ°©λ²κ³Ό κ±°μ λμΌνμ§λ§, stateκ° μΈμ
μ€ν 리μ§μλ μ μ₯λλ κ²μ
λλ€.
const [number, setNumber] = useState(1);
λ€μκ³Ό κ°μ΄ useState hookμ μ¬μ©ν΄ μνλ₯Ό κ΄λ¦¬νλ€λ©΄,
const [μνλ getter μ΄λ¦, μνλ setter μ΄λ¦] = useSessionStorage({key, 1});
μ΄λ κ² λΉμ·ν νμμΌλ‘ useSessionStorage hookμ μ¬μ©ν μ μμ΅λλ€.
μ€μ μ½λ μμμ μ hookμ μ¬μ©ν΄ μ΄λ»κ² μλμ μ₯ λ° μ΄μ΄μ μμ±νκΈ° κΈ°λ₯μ ꡬννλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μ μ κ° μ²μ κ³ν μμ± νμ΄μ§μ μ κ·Όνκ² λλ©΄, 1λ¨κ³μΈ κ³ν μμ΄μ½ μ νκΈ° λ¨κ³μ μ§μ
νκ² λ©λλ€. κ·Έλ¬λ©΄ μ μ΄λ―Έμ§μ μ΄λ‘μ λ°μ€μ ν΄λΉνλ κ³ν μμ΄μ½ μ»΄ν¬λνΈμμ useSessionStorage
hookμ μ΄μ©ν΄ κ³ν μμ΄μ½ dataλ₯Ό κ΄λ¦¬ν©λλ€.
CreatePlanIcon.tsx
const [iconNumber, setIconNumber] = useSessionStorage<number | null>({
key: SESSION_STORAGE_KEY.STEP_1,
initialValue: null,
});
1λ¨κ³μ ν΄λΉνλ keyμΈ μμ SESSION_STORAGE_KEY.STEP_1
λ₯Ό μΈμλ‘ μ λ¬ν΄μ£Όκ³ , 맨 μ²μμλ μ νλ μμ΄μ½μ΄ μκΈ° λλ¬Έμ μ΄κΈ°κ°μ null
λ‘ μ λ¬ν΄μ€λλ€.
κ·Έλ¦¬κ³ μ΄ hookμ ν΅ν΄ λ°νν getter, setter μν μ νλ iconNumber
μ setIconNumber
λ₯Ό κ°κ° νμν λΆλΆμ μ°κ²°ν΄μ€λλ€.
λ€μκ³Ό κ°μ΄ μμ΄μ½ μ ν λͺ¨λ¬μμ μ μ κ° νΉμ μμ΄μ½μ ν΄λ¦νμ λ, μ»΄ν¬λνΈ λ΄μ κ³ν μμ΄μ½ dataκ° λ³κ²½λμ΄μΌ ν©λλ€. λ°λΌμ, μμ΄μ½ μ ν λͺ¨λ¬ μ»΄ν¬λνΈμ setIconNumber
λ©μλλ₯Ό μΈμλ‘ λκ²¨μ£Όκ³ , μμ΄μ½ μ ν λͺ¨λ¬ μ»΄ν¬λνΈ λ΄ κ° μ΄λ―Έμ§μ ν΄λ¦ 리μ€λμ setIconNumber
λ©μλλ₯Ό λ±λ‘ν΄μ€λλ€.
CreatePlanIcon.tsx
<Modal>
<ModalSelectIcon
setIconNumber={setIconNumber}
closeModal={() => {
setIsSelectIconModalOpen(false); // μμ΄μ½ μ ν λͺ¨λ¬ μ»΄ν¬λνΈμ setIconNumber λ©μλλ₯Ό μΈμλ‘ λ겨μ€
}}
/>
</Modal>
ModalSelectIcon.tsx
<Image
src={`/animal/${planIcons[iconNumber]}.png`}
width={40}
height={40}
alt="example plan icon"
className={classNames('select-icon-modal__icon-image')}
onClick={() => { // ν΄λ¦ 리μ€λμ setIconNumber λ©μλλ₯Ό λ±λ‘
setIconNumber(iconNumber);
closeModal();
}}
/>
λ°λΌμ, μμ΄μ½μ΄ ν΄λ¦λμμ λ μμ΄μ½ dataλ ν΄λ¦λ μμ΄μ½μ ν΄λΉνλ numberλ‘ λ³κ²½λκ³ , μΈμ μ€ν 리μ§μ μ 보λ λμμ λ³κ²½λλ κ²μ λ³Ό μ μμ΅λλ€. μ¦, μ»΄ν¬λνΈ λ΄ stateκ° μΈμ μ€ν 리μ§μλ μλμΌλ‘ μ μ₯λλ κ²μ λλ€.
λν, μμ΄μ½μ μ νν ν λ€λ₯Έ νμ΄μ§λ‘ κ°λ€κ° λ€μ κ³ν μμ± νμ΄μ§λ‘ μμ λ μ΄μ dataλ₯Ό μ¬μ©ν΄ μ΄μ΄μ μμ±ν μ μμ΅λλ€.
κ³ν μμ± νμ΄μ§μ λ€μ μ κ·Όνλ€λ©΄, κ³ν μμ΄μ½ μμ± μ»΄ν¬λνΈκ° λ€μ mount λκ³ , μ»΄ν¬λνΈ λ΄ stateλ λ€μ μ΄κΈ°νλ κ²μ λλ€. μ¦ μλμ μ½λκ° λ€μ μ€νλ κ²μ λλ€.
const [iconNumber, setIconNumber] = useSessionStorage<number | null>({
key: SESSION_STORAGE_KEY.STEP_1,
initialValue: null,
});
νμ§λ§ μ§κΈμ μ΄λ―Έ μ΄μ μ μ¬μ©ν dataκ° μΈμ
μ€ν 리μ§μ λ¨μμκΈ° λλ¬Έμ, inivialValueλ‘ μ λ¬λ null
μ΄ μλλΌ μΈμ
μ€ν 리μ§μ κ°μ μ΄κΈ°κ°μΌλ‘ μ¬μ©ν©λλ€. λ°λΌμ λ€μκ³Ό κ°μ΄ μ΄μ΄μ μμ±νκΈ°κ° κ°λ₯ν©λλ€.