๋ชฉ์ฐจ
- ์ปดํฌ๋ํธ
- ๋ผ์ฐํฐ
์ปดํฌ๋ํธ๋ ํ์ด์ง ์ปดํฌ๋ํธ์, ์ผ๋ฐ ์ปดํฌ๋ํธ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ง๋ค์์ต๋๋ค.
๊ณตํต
- ํ์ด์ง, ์ผ๋ฐ ์ปดํฌ๋ํธ ๋ชจ๋ Element๋ฅผ ๋ฐํ ํ๋๋ก ํจ
- ์ด๋ฒคํธ๋ ํด๋น ์ปดํฌ๋ํธ์์ ๋ฑ๋ก
- wrapper ์์ ๋ง๋ค๊ธฐ (createElement)
- template ๋ง๋ค๊ธฐ
- ์์์ template ์ถ๊ฐ (innerHTML)
- ์ด๋ฒคํธ ๋ฑ๋ก (addEventListener)
- wrapper ์์ ๋ฐํ
function Component() {
const $wrapper = document.createElement('div');
const template = `<div>foo</div>`;
$wraaper.innerHTML = template;
$wrapper.addEventListener('click', () => console.log('foo'));
return $wrapper;
};
- wrapper ์์ ๋ง๋ค๊ธฐ (createElement)
- ํด๋น ํ์ด์ง์ ํ์ํ ์ปดํฌ๋ํธ ๋ฑ๋ก (append)
- wrapper ์์ ๋ฐํ
function MainPage() {
const $wrapper = document.createElement('div');
$wrapper.append(
Header(),
OtherComponent(),
Footer(),
);
return $wrapper;
}
ํจ์
- routes
- router
- navigate
๊ฒฝ๋ก์ ํด๋น ๊ฒฝ๋ก์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
- 'posts/1', 'posts/2' ๋ฑ์ path์ ๋์ ํ๊ธฐ ์ํด regExp ์ ์ฉ
const routes = [
{ path: /^\/$/, component: Landing },
{ path: /^\/main$/, component: Main },
];
๊ฒฝ๋ก์ ํด๋น๋๋ ํ์ด์ง ์ปดํฌ๋ํธ '.app'์ ์ฝ์
- routes์์ path์ ํด๋นํ๋ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
- '.app' ์ด๊ธฐํ (ํ์ด์ง ์ค๋ณต ๋ฐฉ์ง)
- ํ์ด์ง ์ปดํฌ๋ํธ '.app'์ ์ฝ์
export const router = (routes, path) => {
const component = routes
.find(route => route.path.test(path))
.component;
$('.app').innerHTML = '';
$('.app').append(component());
};
a ํ๊ทธ ํด๋ฆญ์ navigate ํจ์ ํธ์ถ
- ํ์ด์ง ์์ฒญ ๋ง๊ธฐ (preventDefault)
- target์ href ์์ฑ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ (getAttribute)
- url ๋ณ๊ฒฝ (history.pushState)
- router ํจ์ ํธ์ถ
export const navigate = e => {
e.preventDefault();
const path = e.target.getAttribute('href');
window.history.pushState({}, null, path);
router(routes, path);
};