μ±κΈ νμ΄μ§ μ ν리μΌμ΄μ μ μ½μ΄μ΄λ€. λ» κ·Έλλ‘ ν κ°μ νμ΄μ§λ‘ μ΄λ£¨μ΄μ§ μ ν리μΌμ΄μ !
μ ν리μΌμ΄μ μ λΈλΌμ°μ μ λΆλ¬μμ μ€νμν¨ νμ μ¬μ©μμμ μΈν°λμ μ΄ λ°μνλ©΄ νμν λΆλΆλ§ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ μ λ°μ΄νΈ ν΄μ€ μ μλ€. κ·Έλ¦¬κ³ λ€λ₯Έ μ£Όμμ λ€λ₯Έ νλ©΄μ 보μ¬μ£Όλ κ²μ λΌμ°ν μ΄λΌκ³ νλ€. 리μ‘νΈ λΌμ΄λΈλ¬λ¦¬λ 리μ‘νΈ λΌμ°ν°, λ¦¬μΉ λΌμ°ν°, Next.js κ° μλ€.
μ±μ κ·λͺ¨κ° 컀μ§λ©΄μ μλ°μ€ν¬λ¦½νΈμ νμΌμ΄ λ무 컀μ§λ€λ κ². νμ§λ§ μ΄ λ¨μ μ 보μν΄μ€ μ½λ μ€ν리ν μ΄ μμ΄μ μ΄ κ²μ μ¬μ©νλ©΄ λΌμ°νΈλ³λ‘ νμΌλ€μ λλμ΄μ νΈλν½κ³Ό λ‘λ© μλλ₯Ό κ°μ ν μ μλ€. μλ°μ€ν¬λ¦½νΈκ° μ€νλ λκΉμ§ νμ΄μ§κ° λΉμ΄ μκΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈ νμΌμ΄ λ‘λ©λμ΄ μ€νλλ 짧μ μκ° λμ ν° νμ΄μ§κ° λνλ μ μλ€. μ΄λ°μ λ μλ² μ¬μ΄λ λ λλ§μ ν΅ν΄ λͺ¨λ ν΄κ²°ν μ μμ΅λλ€.
λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ ꡬνμ΄ κ°λ₯νλ €λ©΄ λ€μ λ κ°μ§ κΈ°λ₯μ΄ νμνλ€.
μ΄λ¬ν 쑰건μ λ§μ‘±νλ λΈλΌμ°μ apiλ pushState, replaceState ν¨μμ popstate μ΄λ²€νΈμ΄λ€. apiμ΄λ¦μμ μ μ μλ―μ΄ λΈλΌμ°μ μλ νμ€ν 리μ stateλ₯Ό μ μ₯νλ μ€νμ΄ μ‘΄μ¬νλ€.
import React, { useEffect } from "react";
export default function HistoryShow() {
useEffect(() => {
window.onpopstate = function (event) {
console.log(`location: ${document.location}, state: ${event.state}`);
};
}, []);
return (
<div>
<button onClick={() => window.history.pushState("v1", "", "/page1")}>
page1
</button>
<button onClick={() => window.history.pushState("v1", "", "/page2")}>
page2
</button>
</div>
);
}
첫 λ²μ§Έ μ μ½λλ /page1κ³Ό /page2λ‘ λ²κ°μ λ³κ²½λλ κ²μ νμΈν μ μλ€. μ΄λ μλ²λ‘ μμ²μ΄ κ°μ§ μκ³ νλ©΄λ λ³νμ§ μλλ€. λ¨μ§ μ€νμ stateκ° μμΌ λΏμ΄λ€. onpopstate ν¨μλ νΈμΆλμ§ μλλ€. useEffect ν¨μλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό λ±λ‘νκ±°λ, apiλ₯Ό νΈμΆνλ λ±μ λΆμ ν¨κ³Όλ₯Ό μ²λ¦¬ν λ μ¬μ©νλ ν μ΄λ€.
import React, { useEffect, useState } from "react";
export default function HistoryShow02() {
const [pageName, setPageName] = useState("");
useEffect(() => {
window.onpopstate = (event) => {
setPageName(event.state);
};
}, []);
//λ²νΌ 1
function onClick1() {
const pageName = "page1";
window.history.pushState(pageName, "", "/page1");
setPageName(pageName);
}
//λ²νΌ 2
function onClick2() {
const pageName = "page2";
window.history.pushState(pageName, "", "/page2");
setPageName(pageName);
}
return (
<>
<button onClick={onClick1}>page1</button>
<button onClick={onClick2}>page2</button>
{!pageName && <Home />}
{pageName === "page1" && <Page1 />}
{pageName === "page2" && <Page2 />}
</>
);
}
function Home() {
return <h2>μ¬κΈ°λ ννμ΄μ§μ
λλ€.</h2>;
}
function Page1() {
return <h2>μ¬κΈ°λ νμ΄μ§ 1μ
λλ€.</h2>;
}
function Page2() {
return <h2>μ¬κΈ°λ νμ΄μ§ 2μ
λλ€.</h2>;
}
λ λ²μ§Έ μ΄ μ½λλ νμ¬ νμ΄μ§ μ 보λ₯Ό pageName μν―κ°μΌλ‘ κ΄λ¦¬νλ€. popstate μ΄λ²€νΈκ° λ°μνλ©΄ νμ΄μ§λ₯Ό μ ννλ€λ μλ―Έλ‘ pageName μν―κ°μ μμ νλ€. λΈλΌμ°μ νμ€ν 리 stateλ₯Ό νμ΄μ§ μ΄λ¦μΌλ‘ μ¬μ©νκ³ μλ€. νμ΄μ§ λ²νΌ ν΄λ¦μ νΈμΆλλ μ΄λ²€νΈ μ²λ¦¬ ν¨μλ€. νμ΄μ§ λ²νΌμ λλ₯΄κΈ° μ μλ Home μ»΄ν¬λνΈκ° λ λλ§λλ€. 첫 λ²μ§Έ νμ΄μ§ λ²νΌμ ν΄λ¦νλ©΄ Page1 μ»΄ν¬λνΈκ° λ λλ§λκ³ , λ λ²μ§Έ νμ΄μ§ λ²νΌμ ν΄λ¦νλ©΄ Page2 μ»΄ν¬λνΈκ° λ λλ§λλ€. νμ΄μ§ λ²νΌμ ν΄λ¦νλ©΄ λΈλΌμ°μ μ£Όμμ°½μ λ΄μ©μ΄ λ³κ²½λκ³ , λΈλΌμ°μ μ λ€λ‘ κ°κΈ° λ²νΌμ ν΄λ¦ν΄λ μλν λλ‘ μ λμνλ κ²μ νμΈν μ μλ€.