SPA는 브라우저에서 한 페이지로 동작하며, 페이지 전환 시 전체 페이지를 새로고침하지 않고 부분적으로 변경합니다.
History API는 JavaScript에서 SPA의 라우팅을 더 세밀하게 제어하고, 브라우저의 기본적인 탐색 기능(뒤로 가기, 앞으로 가기)을 활용할 수 있게 해줍니다.
history.pushState(
{ user: 'JohnDoe', loggedIn: true },
'',
'/dashboard'
);
window.addEventListener('popstate', function(event) {
console.log('popstate 이벤트 발생!');
console.log('현재 상태:', event.state);
});
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script></script>
</head>
<body>
<ul>
<li>
<a href="/" data-url="home">Home</a>
</li>
<li>
<a href="/about" data-url="about">About</a>
</li>
<li>
<a href="/contact" data-url="contact">Contact</a>
</li>
</ul>
<div id="page">Home 페이지입니다.</div>
</body>
</html>
// 각 페이지의 콘텐츠 정의
const pages = {
home: "Home 페이지입니다.",
about: "About 페이지입니다.",
contact:
"Contact 페이지입니다. <input text='text' placeholder='연락처 입력 하세요' />",
};
//링크 클릭 이벤트 처리
const aEls = document.querySelectorAll("a");
aEls.forEach((aEl) =>
aEl.addEventListener("click", function (e) {
e.preventDefault();
const page = e.currentTarget.dataset.url; // 클릭된 링크의 data-url 속성 값을 가져오기
history.pushState({ page: page }, "", `/${page}`);
// history.pushState()를 사용하여 새로운 URL과 상태를 히스토리 스택에 추가합니다.
document.getElementById("page").innerHTML = pages[page];
//해당 페이지의 콘텐츠를 pages 객체에서 가져와 #page 요소에 표시합니다.
})
);
//뒤로 가기 및 앞으로 가기 이벤트 처리
//이벤트가 발생하면, event.state에서 이전에 저장한 상태 정보를 가져와서 #page 콘텐츠를 해당 페이지로 업데이트합니다.
window.addEventListener("popstate", function (event) {
const page = event.state?.page || "home";
console.dir(event.state?.page || "home"); // event.state?.page가 없으면 기본값인 "home"을 사용합니다.
console.log("뒤로가기 또는 앞으로 가기가 눌렸음");
document.getElementById("page").innerHTML = pages[page];
});