์ด๋ฒ์ 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
'๐ WIL > ๐ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Polyfill์ด๋? (1) | 2024.12.08 |
---|---|
๐ก axios await/async vs then (0) | 2022.08.11 |
๐ก ํ์๋๋ก e.target.value๋ฅผ ์ด์ฉํ๋๋ฐ, ์์๊ฐ์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ค..? - ํ ํ๋ก์ ํธ (0) | 2022.08.11 |
โ๏ธ ๋น๊ตฌ์กฐํ ํ ๋น (0) | 2022.08.10 |
๐ก ์์ ๋ณต์ฌ, ๊น์ ๋ณต์ฌ (0) | 2022.08.10 |