e.stopPropagation()๊ณผ e.preventDefault()๋ ๋น์ทํ๊ฒ ์ฌ์ฉ๋์ง๋ง, ์์ ๋ค๋ฅธ ์ด๋ฒคํธ์ด๋ค.
e.stopPropagation()์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ ํ๊ทธ์์ ์คํ๋์ง ์๋๋ก ๋ง๋ ์ญํ ์ ํ๋ค. ๋ค์๋งํด ์ด๋ฒคํธ์ ๋ฒ๋ธ๋ง์ ์ค์งํ์ฌ ํ์ฌ ์ด๋ฒคํธ๊ฐ ์์ ์์(๋ถ๋ชจ)๋ก ์ ํ๋๋ ๊ฒ์ ๋ง๋๋ค.
e.preventDefault() ๋ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋์์ ๊ฐ์ง ์ผ๋ถ ์ด๋ฒคํธ๊ฐ ํด๋น ๊ธฐ๋ณธ ๋์์ ์คํํ์ง ์๋๋ก ๋ฐฉ์งํ๋ค. ๋ณดํต ๋งํฌ ํด๋ฆญ ์ ํ์ด์ง ์ด๋๋ง๊ธฐ, ํผ ์ ์ถ์ ํ์ด์ง ๋ฆฌ๋ก๋ ๋ฐฉ์ง๋ฑ์ ๊ธฐ๋ณธ ๋์ ์ ์ด ์ญํ ์ ํ๋ค.
e.stopPropagation()
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ฒ๋ธ๋ง์ ๋ฐฉ์งํด์ค๋ค.
( ๋ฒ๋ธ๋ง : ์ด๋ฒคํธ์ ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ๋ก (์์ชฝ -> ๋ฐ๊นฅ์ชฝ) ์ ํ๋๋ ๊ฒ. )
export default function Toolbar() {
return (
<div className="Toolbar" onClick={() => {
alert('You clicked on the toolbar!');
}}>
<button onClick={() => alert('Playing!')}>
Play Movie
</button>
<button onClick={() => alert('Uploading!')}>
Upload Image
</button>
</div>
);
}
์์ ๊ฐ์ react ์ฝ๋์์, `<button>` ์ ํ๋๋ผ๋ ํด๋ฆญํ๋ฉด, ๋ฒํผ์ alert๊ฐ ๋ ธ์ถ๋๊ณ ,
๊ณง์ด์ด ๋ฐ๋ก ๋ถ๋ชจ์ธ `<div>`์ alert๋ ๋ ธ์ถ๋์ด ์ด 2๊ฐ์ alert์ฐฝ์ด ๋ ธ์ถ๋๋ค.
์ด๋ ๊ฒ ์ด๋ฒคํธ ์ ํ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ง๊ธฐ์ํด์ ์๋์ ์ฝ๋๋ก ์์ ํ์ฌ e.stopPropagation()์ ํธ์ถํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฟ์ง ๋ชปํ๋๋ก ์ ํ๋ฅผ ๋ง์์ฃผ๋ฉด ๋๋ค.
function Button({ onClick, children }) {
return (
<button onClick={e => {
e.stopPropagation();
onClick();
}}>
{children}
</button>
);
}
export default function Toolbar() {
return (
<div className="Toolbar" onClick={() => {
alert('You clicked on the toolbar!');
}}>
<Button onClick={() => alert('Playing!')}>
Play Movie
</Button>
<Button onClick={() => alert('Uploading!')}>
Upload Image
</Button>
</div>
);
}
e.preventDefault()
์ด๋ฒคํธ์ ๊ธฐ๋ณธ ๋์์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ์ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋์์ ๋ง๋ ๊ฒ.
์๋ฅผ๋ค์ด, `<form>`์ submit ์ด๋ฒคํธ๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์ด์ง ์ ์ฒด๊ฐ ๋ฆฌ๋ก๋ ๋๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋์์ด๋ค.
export default function Signup() {
return (
<form onSubmit={() => alert('Submitting!')}>
<input />
<button>Send</button>
</form>
);
}
submit์ ๊ธฐ๋ณธ ๋์์ผ๋ก ํ์ด์ง ์ ์ฒด๊ฐ ๊น๋นก๊ฑฐ๋ฆฌ๋ ํ์์ด ๋ฐ์ํ๋๋ฐ, ์ด๋ฌํ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋์์ ๋ง๊ธฐ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก e.preventDefault()์ด๋ค.
export default function Signup() {
return (
<form onSubmit={e => {
e.preventDefault();
alert('Submitting!');
}}>
<input />
<button>Send</button>
</form>
);
}
์ด๋ ๊ฒ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋์์ ๋ง์์ผ๋ก์, submit์ ํ์ฌ๋ ํ์ด์ง๊ฐ ๊น๋นก๊ฑฐ๋ฆฌ๋ ํ์์ด ์ฌ๋ผ์ง๋ค.
๐ธ ์ถ์ฒ ๐ธ
https://react.dev/learn/responding-to-events#event-propagation
https://ko.react.dev/learn/responding-to-events#can-event-handlers-have-side-effects
https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault
https://developer.mozilla.org/ko/docs/Web/API/Event/stopPropagation
https://developer.mozilla.org/ko/docs/Web/API/Event/stopImmediatePropagation
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ JS ] Promise VS async await ๋น๊ต (0) | 2024.08.25 |
---|---|
[ JS ] Event.stopPropagation์ Event.preventDefault ์ ์ฐจ์ด์ ์์๋ณด๊ธฐ. (0) | 2024.07.14 |
[ TypeScript ] ํ์ ์ ์ํ interface ์ ํํธ ์ฃผ์ ๋ฌ๊ธฐ. (0) | 2023.06.30 |
[TS] ํ๋ก์ ํธ์ tsconfig ์ค์ ํ๊ธฐ. (0) | 2023.05.28 |
[ JavaScript ] async await ๋ฌธ๋ฒ (0) | 2022.12.04 |