[React 11] - Event-Bubbling / Event-Delegation

yiwoojungยท2022๋…„ 7์›” 12์ผ
0

{C} Codecamp FE 06

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

๐ŸŒป ์˜ค๋Š˜์˜ ๋ชฉํ‘œ

  1. ์ œ์–ด ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ œ์–ด ์ปจํฌ๋„ŒํŠธ
  2. Event-Bubbling / Event-Delegation
  3. Library


โ›…๏ธ 1. ์ œ์–ด ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ œ์–ด ์ปจํฌ๋„ŒํŠธ

controlled component / uncontrolled component

์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ž€ state์™€ input์„ ๋”ฑ ๋‹ฌ๋ผ๋ถ™๊ฒŒ๋” ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งํ•œ๋‹ค.
state๋ฅผ ๋น„์›Œ์ฃผ๋ฉด input์„ ๋น„์›Œ์ค„ ์ˆ˜ ์žˆ๋‹ค. state๋กœ input์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๊ณ ํ•ด์„œ ์ œ์–ด์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด์กฐ๊ฑด ์ข‹์€๊ฑด ์•„๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์ž…๋ ฅํ• ๋•Œ ๋งˆ๋‹ค props๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๋ฌธ์˜ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๊ต‰์žฅํžˆ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฐ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด์กฐ๊ฑด ์ข‹์€ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ๊ธ€ ๋“ฑ๋กํ•˜๊ณ ๋‚˜์„œ ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ document.getElement๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋ฉด ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋Š” input์— ์ž‘์„ฑ๋œ ๊ฐ’์ด state๋ผ๊ณ  100% ๋”ฑ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ณ„์ขŒ๋ฒˆํ˜ธ์ฒ˜๋Ÿผ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ œ์–ด์ปดํฌ๋„ŒํŠธ๋ฅผ ์จ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (์ œ์–ด์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ์•ˆ์ „ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง„๋‹ค.)
๋ฐ˜๋ฉด์— ์ด๋Ÿฐ ์ค‘์š”ํ•œ ๊ธ€์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์ด ์—†๊ฒŒ๋” ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.


2. Event-Bubbling / Event-Delegation

๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์—์„œ
์–ด๋””๋ฅผ ๋ˆ„๋ฅด๋”๋ผ๋„ ๋™์ผํ•œ ๋กœ์ง์ด ์‹คํ–‰๋˜๊ฒŒ๋” ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” onClick์„ ์–ด๋””์— ๋‘์–ด์•ผ ํ• ๊นŒ? ์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด event-bubbling์ด๋‹ค.

Event-Bubbling

event-bubbling์ด๋ž€ ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒ(์˜ฎ๊ฒจ๊ฐ)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ž์‹์„ ๋ˆŒ๋ €๋Š”๋ฐ onClick์ด ์ž์‹๊ณผ ๋ถ€๋ชจ์—์„œ ๋ชจ๋‘ ์‹คํ–‰๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
(์ด์™€ ๋ฐ˜๋Œ“๋ง๋กœ Event-Capturing์ด ์žˆ๋‹ค. )

event-bubbling์„ ์œ„ํ•ด์„œ ์ด์ฒ˜๋Ÿผ writer, contents, date์— id๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๊ธด ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋ชจ๋“  ์ž์‹๋“ค์—๊ฒŒ ์•„์ด๋””๋ฅผ ๋‹ค ์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.
๋” ์ข‹์€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ๋ฐ”๋กœ event.currentTarget.id ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์œ„ ์ฒ˜๋Ÿผ id๋ฅผ ๋ถ€๋ชจ์— ์ ์–ด์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์˜ event.target.id๋ฅผ event.currentTarget.id ๋กœ ์ž‘์„ฑํ•ด์„œ ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Event-Delegation

event-delegation๋Š” ์—ฌ๋Ÿฌ ์žฅ์ ๋“ค์ด ์žˆ๋‹ค.
์ถœ์ฒ˜

  1. ๋งŽ์€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™”๊ฐ€ ๋‹จ์ˆœํ•ด์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ˆ์•ฝ๋œ๋‹ค.
  2. ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๋•Œ ํ•ด๋‹น ์š”์†Œ์— ํ• ๋‹น๋œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์งง์•„์ง„๋‹ค.
  3. innerHTML์ด๋‚˜ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ์š”์†Œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DOM ์ˆ˜์ •์ด ์‰ฝ๋‹ค.


3. Library

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€ ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“ค์–ด๋†“์€ ํŠน์ • ๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•˜๊ณ 
ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ง‘ํ•ฉ์‹œ์ผœ ๋†“์€ ๋„๊ตฌ ๋ชจ์Œ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 1. ์‹œ๊ฐ„ ์ ˆ์•ฝ ๊ณผ 2. ๋ฒ„๊ทธ ์ตœ์†Œํ™”์˜ ์žฅ์ ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ ์‹ค์ œ๋กœ ์„œ๋น„์Šค ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด์„œ ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ๋ฐœํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค.

๋ฒ ์ŠคํŠธ 10 ๋ฆฌ์•กํŠธ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 2020

UI ํ”„๋ ˆ์ž„์›Œํฌ - Ant Design, Material-UI

๋ฆฌ์•กํŠธ์—์„œ ์ฐจํŠธ๊ทธ๋ ค์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - Recharts

์ง„ํ–‰๋ฅ  UI - antd progress

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

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