๐Ÿ“† 22.10.19 - ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ง‰๊ธฐ

๋ฒ„๋“คยท2022๋…„ 10์›” 19์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
11/58

UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” A๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ ์œ„์— B๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ํ•ด๋‹น B๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๋™์‹œ์ผฐ์„ ๋•Œ, A ์ด๋ฒคํŠธ๋„ ์ž‘์šฉ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.
์›ํ•˜๋Š” ์ด๋ฒคํŠธ๋งŒ ์ž‘๋™ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ์— ๋Œ€ํ•˜์—ฌ ๊ผญ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผํ•œ๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง (Event Bubbling)

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด๋ž€ ํŠน์ • ํ™”๋ฉด ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋” ์ƒ์œ„์˜ ํ™”๋ฉด ์š”์†Œ๋“ค๋กœ ์ „๋‹ฌ๋˜์–ด ๊ฐ€๋Š” ์ฆ‰, ์ตœ์ƒ๋‹จ์˜ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต๋˜๋ฉด์„œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด ์กฐ๊ธˆ ๋” ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ด๋Ÿฌํ•˜๋‹ค.

<body>
	<div class="adult">
		<div class="child">
			<div class="baby">
			</div>
		</div>
	</div>
</body>

์ƒ๋‹จ์˜ adult div ๊ฐ’ ํ•˜๋‹จ์œผ๋กœ child, baby ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  clickEvent๋ฅผ ํ†ตํ•˜์—ฌ
ํ•ด๋‹น UI์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ฐ™์ด ์ข…์†๋˜์–ด์žˆ๋Š” div ์„ธํŠธ ๋‚ด์—์„œ ์ตœํ•˜์œ„ ์š”์†Œ๋ถ€ํ„ฐ ๋ถ€๋ชจ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ ์ฐจ์ธต ์‹คํ–‰๋œ๋‹ค.

์œ„์˜ ์ด๋ฏธ์ง€๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์บ ํ•‘์žฅ ์ •๋ณด ์กฐํšŒ ์„œ๋น„์Šค์˜ ๊ฒฐ๊ณผ ์ปดํฌ๋„ŒํŠธ์ธ๋ฐ, ์บ ํ•‘์žฅ์‚ฌ์ง„์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ์บ ํ•‘์žฅ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌ๊ฒŒ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” div๊ฐ’ ๋‚ด์— ํ•ด๋‹น ์‚ฌ์ง„๊ณผ ๊ทธ๋ฆฌ๊ณ , ๋ถ๋งˆํฌ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ํ•˜์œ„ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ถ๋งˆํฌ๋งŒ ์ž‘๋™์„ ์‹œํ‚ค๊ณ  ์‹ถ์–ด๋„, ์ƒ์œ„์˜ ์‚ฌ์ง„์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋Š” ์ด๋ฒคํŠธ๊นŒ์ง€ ์ ์šฉ๋˜์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์„ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์˜ ์˜ˆ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ๋˜๋Š”๊ฐ€..!

stopPropagation

 <CampImgBox>
          <BookmarkBorderIcon
            onClick={(e) => {
              e.stopPropagation();
              unpick(camp.campId);
            }}
          >
            <img
              src="/images/picked2.svg"
              alt="Bookmarked"
              style={{ width: "36px", height: "36px" }}
            />
          </BookmarkBorderIcon>
        </CampImgBox>

์ด ์ฝ”๋“œ๋Š” ์œ„์˜ ๋ถ๋งˆํฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€๋ถ„์„ ๋ฐœ์ทŒํ•œ ๊ฒƒ์ด๋‹ค. (React ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋ฐ”๋ž˜์š”)
onClick์ด๋ผ๋Š” ํด๋ฆญ์ด๋ฒคํŠธ์— ์ž‘์šฉํ•ด์•ผ๋˜๋Š” ํ•จ์ˆ˜ ์œ„์— ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ  e.stopPropagation() ์ด ์“ฐ์—ฌ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋Š”๋ฐ, ์ด stopPropagation์œผ๋กœ ์ƒ์œ„ ์š”์†Œ์— ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฒ„๋ธ”๋ง์„ ์–ต์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์ด ์šฐ๋ ค๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค..? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด stopPropagation ์„ ๊ผญ ์‚ฌ์šฉํ•ด๋ณด์ž.

๋งŒ์•ฝ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์š”์†Œ์— ํ• ๋‹น๋œ ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋“ค์˜ ๋™์ž‘์„ ๋ชจ๋‘ ๋ง‰์œผ๋ ค๋ฉด stopImmediatePropagation() ์„ ์‚ฌ์šฉํ•ด๋ณด์ž. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์š”์†Œ์— ํ• ๋‹น๋œ ํŠน์ • ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋“ค์ด ๋ชจ๋‘ EMP๋ฅผ ๋งž์€ ๋“ฏ, ๋™์ž‘์„ ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

์ด๋ฒคํŠธ ์บก์ฒ˜๋ง (Event Capturing)

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์ด๋ฒคํŠธ ์ „ํŒŒ ๋ฐฉ์‹์„ ์ด๋ฒคํŠธ ์บก์ฒ˜๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฒ„๋ธ”๋ง์— ๋น„ํ•ด์„  ์ ์šฉ๋˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๊ต‰์žฅํžˆ ์ ๋‹ค. ํ•˜์ง€๋งŒ ์บก์ฒ˜๋ง์ด ์šฐ๋ ค๋œ๋‹ค๋ฉด removeEventListner๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง์ ‘ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€