๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ—‚ WIL/๐Ÿ“ JavaScript

CustomEvent

by nalong 2024. 11. 10.

์ด๋ฒˆ์— ProseMirror์—์„œ ๋ถ€๋ชจ-์ž์‹ ๋…ธ๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, React ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— props๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ Props์— ๋”ฐ๋ผ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ProseMirror์—์„œ๋Š” ๋ถ€๋ชจ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ธฐ ์–ด๋ ค์›Œ, ์ƒํƒœ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ๊ณต์œ ํ•˜๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์œ„ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด dispatchEvent ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, dispatchEvent ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. ๐Ÿค”

๐Ÿ“ CustomEvent

1. ์ƒ์„ฑํ•˜๊ธฐ

CustomEvent๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const event = new CustomEvent('crush', {
  detail: { birth: '920503' }
});

์—ฌ๊ธฐ์„œ customEventName์€ ์ด๋ฒคํŠธ์˜ ์ด๋ฆ„์ด๋ฉฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ๋œ๋‹ค.

detail ์˜ต์…˜์€ ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์†์„ฑ์œผ๋กœ, ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜ ์ „๋‹ฌํ•  ๊ฐ’์„ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

2. ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ

์ƒ์„ฑํ•œ CustomEvent๋Š” dispatchEvent ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์š”์†Œ์— ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

const element = document.querySelector('#myElement');
element.dispatchEvent(event);

3. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ CustomEvent ์ˆ˜์‹ ํ•˜๊ธฐ

CustomEvent๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ ํ•˜๊ณ , detail์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  useEffect(() => {
    // CustomEvent ํ•ธ๋“ค๋Ÿฌ ์„ค์ •
    const handleCustomEvent = (event) => {
      console.log(event);
    };

    // ์š”์†Œ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
    const element = elementRef.current;
    element.addEventListener("crush", handleCustomEvent);

    // ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ
    return () => {
      element.removeEventListener("crush", handleCustomEvent);
    };
  }, []);

๋‹ค๋ฅธ ์†์„ฑ๋“ค๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž๋ฉด,

โœ… isTrusted : ์ด๋ฒคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์‚ฌ์šฉ์ž ์•ก์…˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ์—์„œ๋Š” true, ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •ํ–ˆ๊ฑฐ๋‚˜ EventTarget.dispatchEvent()๋กœ ๋ฐœ์†กํ•œ ์ด๋ฒคํŠธ์˜ ๊ฒฝ์šฐ false ์ด๋‹ค.

 

โœ… bubbles : ์ด๋ฒคํŠธ๊ฐ€ DOM ํŠธ๋ฆฌ๋ฅผ ํƒ€๊ณ  ๋ฒ„๋ธ”๋ง ํ•˜๋ฉด true์ธ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ด๋‹ค.

 

โœ… currentTarget : ํ˜„์žฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ ์ค‘์ธ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

++ ์ฝ˜์†”์„ ์ฐ์–ด๋ณด๋ฉด currentTarget ์ด null๋กœ ๋‚˜์˜ค๊ณ  ์žˆ๋Š”๋ฐ ๋ง‰์ƒ console.log('event.target' , event.target); ๋กœ ํ–ˆ์„ ๋•Œ๋Š” ์ œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.๐Ÿ˜ณ


React ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•œ CustomEvent๋Š” React์˜ SyntheticEvent ์‹œ์Šคํ…œ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, dispatchEvent๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๋””์ŠคํŒจ์น˜ํ•œ ๊ฒฝ์šฐ React๊ฐ€ ์ด๋ฒคํŠธ ํ๋ฆ„์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ด currentTarget์ด null๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค...๐Ÿ˜ณ

 

โœ… eventPhase : ํ˜„์žฌ ์ด๋ฒคํŠธ๊ฐ€ ์บก์ฒ˜๋ง ๋‹จ๊ณ„(1), ํƒ€๊นƒ ๋‹จ๊ณ„(2), ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„(3) ์ค‘ ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๐Ÿ˜Ž ๋А๋‚€ ์ 

customEvent๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋А๋‚€ ์žฅ์ ์€ props๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์—†์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ์ ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ๋ฐ˜๋Œ€๋กœ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ „์—ญ์ ์œผ๋กœ ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋А ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์ƒ๊ฐ๋„ ๋“ค์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด props๋กœ ํ•  ์ˆ˜ ์—†๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ ๋Œ€์‹ ์œผ๋กœ  ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋งŒ CustomEvent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

https://blog.logrocket.com/using-custom-events-react/ 

 

Using custom events in React - LogRocket Blog

Learn how to build your own custom events in React apps, an essential skill for frontend devs of all levels, in this complete tutorial.

blog.logrocket.com

https://ko.javascript.info/dispatch-events