ํ ๊ณผ์ ๊ฐ ๋๋๋ฉด ๋ ๋ค๋ฅธ ๊ณผ์ ๊ฐ ์ฃผ์ด์ง๋ค.
๋ง์น ๋ด ์ฝ๋์ ์๋ฌ ๊ฐ๋ค. ํ๋ ํด๊ฒฐํ๋ฉด ํ๋๊ฐ ๋์จ๋ค. (์๋ฉ๋ฐ์ธ๊ฐ?)
์ด์ ์ค๋์ ๊ฑธ์ณ ์์ ๊ณ ์์ด ์ฌ์ง์ฒฉ๊ณผ ๊ณ ์์ด ์ฌ์ง ๊ฒ์๊ธฐ ๊ฐ์๋ฅผ ๋ค์๋ค.
๊ณ ์์ด ์ฌ์ง์ฒฉ์์๋ ์๋์์ฑ ๊ฒ์ ๊ธฐ๋ฅ์ api๋ฅผ ํตํด ๊ตฌํํ๊ณ
๊ณ ์์ด ์ฌ์ง ๊ฒ์๊ธฐ์์๋ ์ปดํฌ๋ํธ ๊ฐ ์์กด์ฑ์ ์๊ฐํด์ ๊ตฌํํ๋ ๋ฒ๊ณผ ์ด๋ฒคํธ ๋๋ฐ์ด์ฑ์ ๊ณ ๊ธ์ค๋ฝ๊ฒ ๊ตฌํํด๋ณด์๋ค.
์ด๋ฅผ ์งํํ๋ฉด์ ์๋ก ์๊ฒ ๋ ์ ๊ณผ ์ด๋ ค์ ๋ ๋ถ๋ถ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
ํจ์ ค๊ณผ ๊ทธ๋ ํ ์์ ๋นต๋ถ์ค๋ฌ๊ธฐ๋ฅผ ํตํด ์์ ์ ์ฐพ์์ค๋ ๊ธธ์ ์๋ ค์ฃผ๋ ๊ฒ์ ์ ๋ํ๋ค๊ณ ํ๋ค. ๊ทธ๋์ ์์ด๋ก ๋นต์ค๋ฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ Breadcrumb์ด๋ผ๊ณ ์ด๋ฆ ์ง์ด์ก๋ค๊ณ ํ๋ค.
๋
ธ์
ํ๋ก์ ํธ ๊ณผ์ ๋ฅผ ์งํํ ๋ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ด ์๋์์ง๋ง ๋ ์ด๊ฑธ ๋ฏธ๋ฆฌ ๊ตฌํํ์๋ค. ์ ์ฒด ๋ฌธ์ ์ ๋ณด๋ฅผ api๋ก ๋ฐ์์ค๊ณ ์ด๋ฅผ ์ฌ๊ท ํ์์ ํตํด header ๋ถ๋ถ์ ํ์ํ์๋ค.
์ด๊ฒ์ ๋ฐฐ์ฐ๊ฒ ๋ ์ค ์๊ณ ๊ตฌํํ๋ ๊ฑด ์๋๋ฐ ์ญ์ ๋ชจ๋ ์๋น์ค๋ ์น ํ์ด์ง์๋ ๊ณตํต์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๋ ๊ธฐ๋ฒ๋ค์ด ์กด์ฌํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ๋ญ๋ ํ ๋ฒ ๋ฐฐ์ธ ๋ ์ ๋๋ก ์์๋๋ฉด ์ธ์ ๋ ์ธ ๋๊ฐ ์๋ ๊ฑฐ ๊ฐ๋ค. (์ ๋น๋ฌดํ)
// render ํจ์ ๋ด
$breadcrumb.innerHTML = `
<div class="BreadCrumb__item">Root</div>
${this.state
.map(
({ id, name }) => `
<div class="BreadCrumb__item" data-id="${id}">${name}</div>
`
)
.join('')}
`;
this.state
๋ ์์ ๊ฐ์ด ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ฐ์์จ๋ค.
์ด๋ฅผ map
ํจ์๋ฅผ ํตํด div
ํ๊ทธ๋ก ๋์ดํด์ ๋ ๋๋งํ๋ ๋ฐฉ์์ด๋ค.
๋ ธ์ ํ๋ก์ ํธ์์๋ api ์ธก์์ state๋ฅผ ์ด๋ ๊ฒ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ์ฒด ํธ๋ฆฌ๋ฅผ ํตํด ๊ตฌํํ ์ฌ์ด๋๋ฐ์์ ์์ ๊ฐ์ state๋ฅผ ์์ฒด์ ์ผ๋ก ๋ง๋ค์๋ค.
api ์ธก์์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ฃผ๋๋์ ๋ฐ๋ผ breadcrumb์ ๊ตฌํํ๋ ๋์ด๋๊ฐ ์ด๋ ๊ฒ ๋ค๋ฅผ ์ค์ด์ผ... ๋ฐฑ์๋์์ ํ์ ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํด์ ๋ฉด๋ฐํ ์๊ธฐํด๋ด์ผ ํ๋ค๋ ๋กํ ๊ฐ์ฌ๋์ ๋ง์์ ๋ผ์ ๋ฆฌ๊ฒ ๊นจ๋ฌ์๋ค.
๊ฐ๊ฐ์ ๊ฒฝ๋ก ์์์ data-id
๋ฅผ ๋ถ์ฌํด์ click ์ด๋ฒคํธ๋ฅผ ํตํด ํด๋น ๊ฒฝ๋ก๋ก ์ด๋ํ๊ฒ ํ ๊ฒ๋ ์ธ์์ ์ด์๋ค.
๋ด ๋
ธ์
ํ๋ก์ ํธ์๋ ๋์ผํ๊ฒ ํด๋ฆญ ์ด๋ฒคํธ์ ๋ผ์ฐํ
์ ํตํด ๊ตฌํํด์ผ๊ฒ ๋ค. (์์งํ ์๊ฐ์ ํ์๋๋ฐ ์๊ฐ์ด ๋ถ์กฑํด์ ๊ตฌํ ๋ชปํ๋ค...)
api์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋์ ์ฌ์ฉ์๊ฐ ๋ฐ๋ณด๋์ง ์๊ธฐ ์ํด์๋ ๋ก๋ฉ ์ค์ ๋ํ UI ๊ตฌํ์ด ํ์์ด๋ค. (๊ทผ๋ฐ ๋ ๋
ธ์
ํ๋ก์ ํธ ๋ ์ํ์ง?)
๊ฐ์ ํ์์ธ ์์ฃผ๋์ ๊ตฌํ์ ํ์ จ์ด์ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ ๋ ์ ์ด๊ฑธ ์๊ฐ ๋ชปํ์ง? ๋ผ๋ ์๊ฐ์ ํ์๋ค. ์์ผ๋ก๋ ํ์์ ์ผ๋ก ๊ตฌํ์ ํด์ผ๊ฒ ๋ค๋ผ๊ณ ๋ค์งํ๋ค.
๋ก๋ฉ ํ๋ฉด ๊ตฌํ์ ์ด๋ ค์ด ๊ฒ์ ์๋ค.
๋ก๋ฉ ์ค์ผ ๋ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด๋๊ณ ๋ก๋ฉ์ค์ผ ๋ display
์์ฑ์ none
์์ block
์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
// ๊ฐ๋จํ๊ฒ img gif ์ฝ์
$loading.innerHTML = `
<div class="content">
<img width="100%" src="https://cdn.roto.codes/images/nyan-cat.gif" alt="Loading..." />
</div>
`;
// this.state์์ isLoading ์ฌ๋ถ์ ๋ฐ๋ผ display ์์ฑ ๋ณ๊ฒฝ
$loading.style.display = this.state ? 'block' : 'none';
์๋ ๊ฒ ๋ก๋ฉ ์ค์ผ ๋ ๊ท์ฌ์ด ๊ณ ์์ด gif๊ฐ ๋์ค๋ฉด ์ฌ์ฉ์๊ฐ ์ง๋ฃจํ์ง๊ฐ ์๋ค.
๋
ธ์
์๋ํฐ๋ฅผ ๊ตฌํํ ๋ enter, ๋ฐฑ์คํ์ด์ค, ํ์ดํ ํค์ ๋ํ keyup ์ด๋ฒคํธ๋ฅผ e.keyCode
๋ฅผ ํตํด ๊ตฌํํ์๋ค.
๊ฐ์ ํ์์ธ ์์ง๋์ ์นผ๊ฐ์ ์ฝ๋ ๋ฆฌ๋ทฐ์์ keyCode
๋ Deprecated๋ ์์ฑ๊ฐ์ด๋ผ๋ ํผ๋๋ฐฑ์ ๋ฐ์๋ค. (๊ฐ์ฌํฉ๋๋ค)
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ทจ์์ ์ด ๊ทธ์ด์ ธ์ ์ด ๋ถ๋ถ์ ์ธ์งํ๊ณ ์์์ผ๋ ์ผ๋จ ๊ตฌํํ๋ ๊ฒ์ ๊ธ๊ธํ์ด์ ๊ทธ๋ฅ ์งํํ์๋ค.
ํ์ง๋ง ์ด๋ฒ ๋กํ ๋ ๊ฐ์์์ e.key
๋ผ๋ ์์ฑ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
window.addEventListener('keyup', (e) => {
// esc๋ฅผ ๋๋ฅผ ๊ฒฝ์ฐ onClose
if (e.key === 'Escape') {
onClose();
}
});
esc๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด ๊ณ ์์ด ์ฌ์ง ๋ชจ๋ฌ์ฐฝ์ ๋ซ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ฝ๋์ด๋ค.
esc์ e.key
๊ฐ์ Escape
์ด๋ฏ๋ก ์์ ๊ฐ์ด ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
์์ผ๋ก ๋ค์ํ ํค์ e.key
๊ฐ์ console.log
๋ฅผ ํตํด ํ์ธํด๊ฐ๋ฉด์ ๊ตฌํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋ ธ์ ํ๋ก์ ํธ์์ ํผ๋๋ฐฑ ๋ฐ์ ๋ถ๋ถ๋ ์ด๋ ๊ฒ ์์ ํด์ผ๊ฒ ๋ค.
setState
ํจ์์ ์ ์ญ State ๊ด๋ฆฌ๋ด ๋
ธ์
ํ๋ก์ ํธ์ App
์ปดํฌ๋ํธ์ setState ๋ชจ์ต์ด๋ค.
this.render
ํจ์๋ ์ ๋ค์ด๊ฐ ์๋ ๊ฑธ๊น...
App
์์์ setState
ํจ์๋ ์ ์ญ์ ์ํ ๊ด๋ฆฌ๋ง ํ๊ณ ๊ฐ ์ตํ์ ์ปดํฌ๋ํธ ๋จ์ setState
์์ ์์กด์ฑ์ด ์๊ฒ ๋
๋ฆฝ์ ์ผ๋ก render๋ฅผ ์งํํด์ผ ํ๋๋ฐ ๋ ๊ทธ๋ฌ์ง ์์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ ๋ฆฌ๋ทฐ์์ ๋นํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ๋ก ๋ถํ์ํ ๋ ๋๋ง์ด ์๋ค๋ ๊ฒ์ ์ง์ ๋ฐ์๋ค.
๊ตฌํ์๋ง ๊ธ๊ธํ๋ค ๋ณด๋ ์ ์ฒด์ ์ธ ์ํ flow ๋ฐ ์ปดํฌ๋ํธ ๊ฐ ์์กด์ฑ์ ์์ ๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์์ ๋ฌธ์ ์๋ค.
App.js
์์๋ ์ ์ญ์ ์ผ๋ก ํฐ ๋จ์์ ์ํ๋ง ๋ค๋ฃจ๊ณ ์ธ๋ถ์ ์ผ๋ก ์ปดํฌ๋ํธ์์๋ ์ ์ญ ์ํ์์ ํ์ํ ์ํ ์์๋ง ๋ฝ์์ ์ํ๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
๋ ธ์ ํ๋ก์ ํธ ๊ตฌํ ์ ์ด๋ฅผ ์๊ฐ์ ์์ ํ์ง ์์ ๊ฒ์ ์๋์ง๋ง ์๊ฐ๋ณด๋ค ๋ ์ฒ ์ ํ๊ฒ ๊ณ ๋ คํด์ผ ์ํ ์ต์ ํ๊ฐ ๋๋ ๊ฒ์์ ๊นจ๋ฌ์๋ค.
์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ํ ๋ฆฌํฉํ ๋ง์์ ์ํ๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ ๊ฒํ๊ณ ์์ผ๋ก ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์งํํ ๋๋ ์ปดํฌ๋ํธ ๊ฐ ๊ตฌ์กฐ ๋ฐ ์ํ ๋ก๋๋งต์ ๊ผญ ๊ตฌ์ฒดํํ๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค.
์๋์์ฑ ๊ฒ์ ์ keyup ์ด๋ฒคํธ๋ฅผ ํตํด ํ ๊ธ์๊ฐ ์ ๋ ฅ๋ ๋๋ง๋ค api ํธ์ถ์ด ๋ฐ์ํ๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ๋๋ฐ์ด์ฑ์ผ๋ก ํด๊ฒฐํด์ผ ํ๋ค.
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋กํ ๊ฐ์ฌ๋์ด ์ฝํ์ผ๋ฟ์ ํตํด ์ถ์ฒ๋ debounce
ํจ์๋ฅผ ์ฌ์ฉํ์
จ๋ค.
// fn ํจ์๋ฅผ delay๋งํผ ๋๋ฐ์ด์ฑํ๋ ํจ์ feat. ์ฝํ์ผ๋ฟ
export default function debounce(fn, delay) {
let timer = null;
return function () {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(context, args);
}, delay);
};
}
์ฒ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ด๊ฒ ๋ญ๋... ํ๋ค. ์ง์ง๋ก ai๋ ๋ชปํ๋๊ฒ ๋ญ์ง?
์๋ก ์๊ฒ ๋ argument
๊ฐ์ฒด์ ๊ฐํญํํ this
์ apply
ํจ์์ ์ผ์์ผ์ฒด์ ์ ์ ์ ๋ชป ์ฐจ๋ ธ๋ค.
๋ฌํํ๊ฒ ์ดํดํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์
fn
ํจ์๋ฅผ
fn
ํจ์๊ฐ ์กด์ฌํ๋ ์ปจํ ์คํธ๋ฅผconst context = this;
๋ฅผ ํตํด ๋ฐ์์ค๊ณ
fn
ํจ์๊ฐ ๋ฐ๋ ์ธ์๋ฅผconst args = arguments;
๋ฅผ ํตํด ๋ฐ์์์
apply
ํจ์๋ฅผ ํตํดfn
์ ์๋ก์ดcontext
ํ๊ฒฝ์์args
์ธ์๋ฅผ ํตํด ํธ์ถํ๋๋ฐ
delay
๊ฐ๋งํผsetTimeout
๋ฅผ ํตํด ๋๋ฐ์ด์ฑ์ ์ ์ฉํ๋ค.
ํ์ง๋ง ์์ง argument
๊ฐ์ฒด์ apply
ํจ์์ ๋ํ ์ ํํ ์ดํด๊ฐ ๋์ง ์์๊ณ
this
๋ฅผ ์ถ๋ ฅํด๋ณธ ๊ฒฐ๊ณผ undefined
๊ฐ ๋์๋๋ฐ ์ ์ด๋ ๊ฒ ๋์ค๋์ง๋ ์ดํด๊ฐ ๋์ง ์์๋ค.
ํ์๋ค๊ณผ ์คํฌ๋ผ์์ ์ด์ ๋ํด ๊ณ ๋ฏผํด๋ณด์์ง๋ง ๋ช ์พํ ํ๋ต์ ์ป์ง ๋ชปํ์๋ค.
๋กํ ๊ฐ์ฌ๋๊ป ์ง๋ฌธ์ ๋๋ฆฐ ๋ค ์ด์ ๋ํ ์ ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ๊ฒ ๋ค.
์ด๋ฒคํธ ๋๋ฐ์ด์ฑ debounce
ํจ์์์ ์ฌ์ฉ๋ argument
๊ฐ์ฒด์ ๋ํ mdn ๋ฌธ์๋ฅผ ์ฝ๊ณ ํ์ฉ๋ฒ์ด๋ ๊ฐ๋
์ ๋ํ ์ ์๋ฅผ ํ๋ฆฝํด์ผ๊ฒ ๋ค.
์ฝ๋ฉํ ์คํธ์์ ์งง์ ํด๋ต ์ฝ๋์ ๋ง์ด ๋ณด์ด๋ apply ํจ์์๋ค. ์ ์ฌ์ฉํ๋ฉด ์ง์ง ์ข๋ค๊ณ ๋ค์ ๊ณ ์ฐจํจ์ ์ค ํ๋๋ผ๊ณ ๋ค์๋ค. ์ด๊ฒ๋ mdn ๋ฌธ์ ๋ฐ ๋ค์ํ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์๋ณด๊ณ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
apply
ํจ์์ argument
๊ฐ์ฒด์ ๋ํด์๋ ์ฒ์๋ถํฐ ์ ๋
๋ฐ ์ ๋ฆฌ๋ฅผ ํด์ผ๊ฒ ๋ค.๐ ํด๋น ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์คํดํ๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค.
์ ํํธ