๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋ ๋ฉ๋ด๋ฅผ ํด๋ฆญํ์ ๋, ํจ์๊ฐ ์คํ๋์ด์ผ ํ๋๋ฐ ์ ์๋๋์ง ์์ ๋๊ฐ ์์๋ค. ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
์ ์๊ฒ ๋๋ฉด ์ ์๋์ด ์ ๋์ง ์์๋์ง ๋ช
ํํ๊ฒ ์ดํดํ ์ ์๋ค.
ํด๋ฆญํ์ ๋, "00๋์ด ์์ฑํ ๊ธ์ ๋๋ค." ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋จ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, onClick์ ์ด๋์ ๋์ด์ผ ํ ๊น? ๊ณต๋ฐฑ์ด๋ div box ์์ญ์ ํด๋ฆญํ๋ฉด ์๋ฆผ์ฐฝ์ ๋จ์ง๋ง, ์๋ฆผ ๋ฌธ๊ตฌ๊ฐ ์ ๋๋ก ๋จ์ง ์๋๋ค. ์ด๋๋ฅผ ํด๋ฆญํ๋ ์ ๋๋ก ์๋ฆผ์ด ๋จ๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์์ div์ onclick ์์ฑ์ ์ถ๊ฐํด์ฃผ๋ฉด, ๋ถ๋ชจ div์ ์๋ onclick ์์ฑ๋ ํจ๊ป ์คํ๋๋ค. ์ฆ ์์ div์ click event๊ฐ ๋ถ๋ชจ div๋ก ์ ํ๋๋ค. ์ด๋ฅผ propagation
์ด๋ผ ํ๋ค. ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ดํดํ๋ฉด ์ฝ๋ค.
์์ div๋ฅผ ๋๋ฅด๋ฉด ๋ถ๋ชจ div๋ ๋๋ฆฌ๊ฒ ๋๋ค. ๋จ, ํ์ div๋ ํด๋ฆญ๋์ง ์๋๋ค. ์ด๋ฐ ์์ผ๋ก ์ด๋ฒคํธ ์ ํ๋ฅผ ํตํด์ ๋ถ๋ชจ๋ก ๊ณ์ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
์ด๋ผ ํ๋ค. ๋ค์ ๋งํด, ํน์ ํ๋ฉด ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ํด๋น ์ด๋ฒคํธ๊ฐ ๋ ์์์ ํ๋ฉด ์์๋ค๋ก ์ ๋ฌ๋๋ ํน์ฑ์ ๋ปํ๋ค.
<form onclick="alert(form)">
<div onclick="alert(div)">
<p onclick="alert(p)">P</p>
</div>
</form>
์๋ฅผ ๋ค์ด, ์์ ๊ฐ์ ๊ตฌ์กฐ์์ p ํ๊ทธ
๋ฅผ ํด๋ฆญํ๋ฉด p -> div -> form ์ ์์๋ก 3๊ฐ์ ๊ฒฝ๊ณ ์ฐฝ์ด ๋ํ๋๊ฒ ๋๋ค.
const onClick = (event: MouseEvent<HTMLDivElement>) => {
if (event.target instanceof Element)
alert(event.target.id + "๋์ด ์์ฑํ ๊ธ์
๋๋ค.");
};
return (
<div>
{data?.fetchBoards?.map((el) => (
<div onClick={onClick} id={el.writer ?? ""}>
<span>{el.number}</span>
<span>{el.title}</span>
<span>{el.writer}</span>
</div>
))}
</div>
);
์ ์์์์๋ onClick ํจ์๊ฐ ์ ๋ชฉ์ด๋ ๋ด์ฉ์ ์๋ ๊ฒ์ด ์๋๋ผ ์ ์ฒด๋ฅผ ๊ฐ์ธ์ฃผ๋ ๋ฐ์ค์ ์์ด์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
์ด ๋ฐ์ํ๋ค. number, title ๋ฑ์ span ํ๊ทธ๊ฐ ์๋ ์์ญ์ ํด๋ฆญํ๋ฉด id๋ฅผ ๋ฐ์์ค์ง ๋ชปํ๋ค. ๊ทธ๋ฌ๋ฉด, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
id๋ฅผ ๋ถ๋ชจ div์ ์ฃผ๊ณ , event.target์ด ์๋ event.currentTarget
์ ์ ์ฉํด์ฃผ๋ฉด ๋๋ค. event.target์ ์ฐ๋ฆฌ๊ฐ ํด๋ฆญํ ํ๊ทธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ๊ทธ ํ๊ทธ์ id๋ฅผ ๊ฐ์ ธ์ค์ง๋ง, event.currentTarget
์ ํ์ฌ ์๋ํ๊ณ ์๋ ํ๊ฒ์ผ๋ก event.target์ผ๋ก ์ธํด ์๋๋๋ ํ๊ทธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๋ฒ๋ธ๋ง์ ํตํด ๋ฐ์ธ๋ฉ๋์ด ์๋ ํ๊ทธ๊ฐ ์๋ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์์(delegation)์ด๋ผ๊ณ ํ๋ค.
๋ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก๋, event.stopPropagation()
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ค.
export default function StaticRoutingPage() {
const { data } = useQuery(FETCH_BOARDS);
const qqq1 = (event) => {
alert("1๋ฒ ํด๋ฆญ");
};
const qqq4 = (event) => {
event.stopPropagation();
// 1๋ฒ์ผ๋ก ์ ํ๋์ง ์๋๋ก ์ค์
alert("4๋ฒ ํด๋ฆญ");
};
return (
<div>
{data?.fetchBoards.map((el: any) => (
<div id={el.writer} onClick={qqq1}>
<Checkbox />
<span style={{ margin: "10px" }} onClick={qqq4}>
{el.number}
</span>
<span style={{ margin: "10px" }}>{el.title}</span>
<span style={{ margin: "10px" }}>{el.writer}</span>
</div>
))}
</div>
);
}
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ฐ๋๋๋ ๊ฐ๋ ์ผ๋ก ์ด๋ฒคํธ ์บก์ฒ๋ง์ด ์์ง๋ง, ๋ํดํธ ๊ฐ์ ๋ฒ๋ธ๋ง์ด๊ธฐ ๋๋ฌธ์ ์บก์ฒ๋ง์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋ก ์ค์ ์ ํด์ค์ผ ํ๋ค.
๊ฐ๋ฐ์๋ค์ ํ ๋จ์๋ก ํ์ ์ ๋ง์ด ํ๋๋ฐ, ๊ทธ ๊ณผ์ ์์ ์ผ์ ์กฐ๊ธ ๋ ์์ํ๊ฒ ์งํํ๋๋ก ํ๊ธฐ ์ํด ์ฝ๋์ ๊ท์น์ ์ ํด ํต์ผ์ฑ์ ๊ฐ์ถ๋๋ก ํ๋ค.
์ฝ๋๋ฆฐํฐ: ๋ฌธ๋ฒ ์ ์๋ฌ๋ ์๋์ง๋ง, ์๋ฌ๋ก ์ฝ์ํ์๊ณ ๊ท์น์ ์ ํ๋ ๊ฒ
์ฝ๋ ํฌ๋ฉํฐ: ์ฝ๋๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ฒ
์ฝ๋๋ฆฐํฐ์ ๋ํ์ ์ธ ๊ฒ์ด eslint
, ์ฝ๋ ํฌ๋ฉงํฐ์ ๋ํ์ ์ธ ๊ฒ์ด prettier
๋ค.
eslint์ prettier๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ vs code์ ์ค์น๋ฅผ ํด์ค์ผ ํ๋ค. eslint๋ ESLinst Extention์, prettier๋ Prettier Extention์ ์ค์นํด์ฃผ๋ฉด ๋๋ค.
์ค๋์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
๊ณผ ์ํํ ํ์
์ ์ํ ์ฝ๋๋ฆฐํฐ
๋ฐ ์ฝ๋ ํฌ๋ฉงํฐ
๋ฅผ ๋ฐฐ์ ๋ค.
๋ถ๋ชจ์ ์์ ํ๊ทธ ๊ฐ์๋ ์ ํ์ ์์์ด ์ ์ผ์ด๋๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฐ ๋ถ๋ถ์ด ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ๋ ํด์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋๋ฐ ์ ๋ฅผ ๋จน๊ณค ํ์ง๋ง, ๊ทธ๋ด์๋ก ์ด๋ฌํ ํน์ง๋ค์ ๋์น์ง ์๊ณ ๊ณต๋ถํด์ผ ํ๋ ๊ฒ ๊ฐ๋ค.
์ฝ๋๋ฅผ ์ ์ง๋ ๊ฒ๊ณผ ๋์์ ๋ด๊ฐ ์ฌ์ฉํ๋ ์์ค์ฝ๋์ ๊ตฌ์ฑ์์๋ค์ด ์ด๋ ํ ํน์ง์ ๊ฐ๊ณ ์๋์ง, ์์๋ค๋ผ๋ฆฌ ์ด๋ ํ ๊ด๊ณ๊ฐ ์๋์ง๊น์ง ์๊ณ ์์ด์ผ ํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ eslint์ prettier extention์ ์ค์นํด์ ์ฌ์ฉ์ ํด๋ดค๋๋ฐ ํ์ ์คํฌ๋ฆฝํธ์ฒ๋ผ ๊ผผ๊ผผํ๊ฒ ๊ท์น์ ์ ํด๋์๊ณ , ์ด๊ฒผ์ ์์ ๋นจ๊ฐ ์ค๋ก ์๋ฌ๋ฅผ ๋์์ค๋ค.
ํ์ ์ ํ ๋, ๋๋ ์๊ณ ์๋ ๊ฒ์ด ์๋๊ฐ ๋ด ์ฝ๋๋ฅผ ์ฝ์์ ๋์๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ํจ๊ป ๊ท์น์ ์ ํ๋ ๊ฑด ์ํํ ์ํต์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค. ๋ฌด์๋ณด๋ค ํํธ๋ฅผ ๋ถ๋ดํด์ ๊ฐ๋ฐ์ ํ๊ณ , ๊ทธ๊ฒ์ ํฉ์ณ์ ํ๋์ ์ฝ๋๋ฅผ ์์ฑ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ท์น์ ํ์์ด์ง ์์๊นํ๋ ์๊ฐ์ด ๋ ๋ค.