url์ #
์ ์ด์ฉํด ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
#
์ ๊ฐ์ ํ์ด์ง ๋ด์ ์์๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ๋ง์ด ์ฌ์ฉ๋์๋ค.
-> ํด์๋ฑ ์ ์๋ฆฌ๋ html์ ๋ค์ ์ต์ปค๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค.
<a href="/">Home</a>
<a href="/#About">About</a>
<a href="/#Contact">Contact</a>
// hashchange ์ด๋ฒคํธ์ hash๋ฅผ ์ถ์ ํด ๋ ๋๋ ํ์ด์ง๋ฅผ ์ ์ ํ๋ค.
const { hash } = window.location
//...
window.addEventListener('hashchange', () => {
//...
}
์ต๊ทผ์๋ SPA์์ ๊ฑฐ์ ์ฐ์ด์ง ์๋๋ค.
๊ทธ๋ฌํ ์ด์ ๋ก ์์ฆ์ history API๋ฅผ ์ด์ฉํด SPA๋ฅผ ๊ตฌํํ๋ค.
๋ธ๋ผ์ฐ์ ์์ ํ์ด์ง ๋ก๋ฉ์ ํ๋ฉด, ์ธ์ ํ์คํ ๋ฆฌ๋ผ๋ ๊ฒ์ ๊ฐ๋๋ค.
์ธ์ ํ์คํ ๋ฆฌ๋ ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค ์์ด๊ฒ ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ค๋ก๊ฐ๊ธฐ ์ ์ด์ ํ์ด์ง๋ก ๊ฐ๊ฑฐ๋ ๋ค๋ก ๊ฐ ์ดํ ๋ค์ ์์ผ๋ก ๊ฐ๋ ๋ฑ์ ์ด๋์ด ๊ฐ๋ฅํ๋ค.
pushState
, replaceState
๋๊ฐ์ ํจ์๋ก ํ๋ฉด ์ด๋์์ด ํ์ฌ url์ ์
๋ฐ์ดํธ ํ ์ ์๋ค.
: ์ธ์ ํ์คํ ๋ฆฌ์ ์ url ์ํ๋ฅผ ์๋๋ค.
: ์ธ์
ํ์คํ ๋ฆฌ์ ์ url ์ํ๋ฅผ ์์ง ์๊ณ , ํ์ฌ url์ ๋์ฒดํ๋ค.
(์ด์ ํ์ด์ง๋ก ๋์๊ฐ๋ ๊ฒ ๋ฐฉ์ง!)
state
: history.state์์ ๊บผ๋ด์ธ ์ ์๋ ๊ฐ์ด๋ค.title
: ๋ณ๊ฒฝ๋ ํ์ด์ง์ title์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ธ๊ฒ ๊ฐ์ง๋ง, ๊ฑฐ์ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์X. ๋น string๋ฃ์ผ๋ฉด ๋๋ค. url
: ์ธ์
ํ์คํ ๋ฆฌ์ ์๋ก ๋ฃ์ url์ด๋ค. aํ๊ทธ๋ฅผ ํด๋ฆญํ๊ฑฐ๋ location.href๋ก url์ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, ์ด url์ด ๋ณ๊ฒฝ๋๋ค๊ณ ํด์ ํ๋ฉด์ด ๋ฆฌ๋ก๋(์๋ก๊ณ ์นจ) ๋๊ฑฐ๋ ํ์ง ์๋๋ค. ๋ค๋ง, pushState()
๋ ์ด์ URL๊ณผ ์ ๊ท URL์ ํด์๊ฐ ๋ค๋ฅด๋๋ผ๋ ์ ๋ hashchange ์ด๋ฒคํธ๋ฅผ ์ ๋ฐํ์ง ์๋๋ค.
์์ ๊ฐ์ ์ด์ ๋ก, popstate()๋ ๊ธฐํ ์ด๋ฒคํธ๋ฅผ ์ด์ฉํด pathname์ ์ถ์ ํ๊ฒ ๋๋ค.
<a href="/" class="link">Home</a>
<a href="/About" class="link">About</a>
<a href="/Contact" class="link">Contact</a>
// link์์ ๋ฐ์ํ๋ click ์ด๋ฒคํธ์ pathname๋ฅผ ์ถ์ ํด ๋ ๋๋ ํ์ด์ง๋ฅผ ์ ์ ํ๋ค.
const { pathname } = location
//...
window.addEventListener('click', (event) => {
if (event.target.className === 'link') {
const href = e.target.getAttribute('href')
history.pushState(null, null, href)
event.preventDefault()
//...
}
}