onClick
onKeyUp
하나의 요소에 이벤트가 발생하면, 해당 요소의 이벤트 핸들러 (함수) 가 작동하고, 이어서 그 부모 요소의 이벤트 핸들러가 작동하고, 그렇게 최상단의 요소까지 각 요소에 할당된 핸들러가 작동한다.
import React from 'react';
function Bubble() {
return (
<div onClick={() => alert('나는 div')}>
div입니다.
<p onClick={() => alert('나는 p')}>p입니다.</p>
</div>
);
}
export default Bubble;
이러한 버블링으로 인해 event.target
과 event.currentTarget
이 다르게 나타난다.
import React from 'react';
function Bubble() {
const onClick = (e) => {
console.log(e.target, e.currentTarget);
// <p>하위</p>
// <div><p>하위</p></div>
};
return (
<div onClick={onClick}>
div입니다.
<p onClick={onClick}>p입니다.</p>
</div>
);
}
export default Bubble;
즉 event.target
은 이벤트 버블링이 발생하는 동안 변하지 않는 최초의 이벤트가 발생한 요소이고, event.currentTarget
은 이벤트 버블링으로 인해 이벤트가 발생하고 있는 현재의 요소를 가리킨다. (이벤트 핸들러가 중첩되어있을 때만 존재함)
이벤트 버블링을 중단할 때는 e.stopPropagation
을 사용한다. 이런 경우 이벤트 버블링이 발생하지 않고 1번만 발생한다.
const Test = () => {
const onClick = (e) => {
e.stopPropagation();
console.log('onclick');
};
return (
<div>
<div onClick={onClick}>
<p onClick={onClick}>하위</p>
</div>
</div>
);
};
이벤트 위임이란 동일한 방식으로 여러 요소를 다뤄야 할 때 사용할 수 있다. 이때 이벤트 위임 방식으로 코드를 작성하면 더 효율적으로 코드를 작성할 수 있다.
const Test = () => {
const onClick = () => {
console.log('onclick');
};
return (
<div>
<div onClick={onClick}>
<p>하위</p>
<p>하위</p>
<p>하위</p>
</div>
</div>
);
};
어떤 태그들은 기본적으로 특정한 동작이 실행되도록 설정이 되어있다. 예를 들어 a 태그는 누르면 해당 링크로 페이지가 넘어가고 form 태그를 사용할 때, 해당 태그 내부에서 button을 누르면 form 태그에 내장된 페이지 이동 기능이 작동하게 된다. 이러한 기본 동작을 방지하려면 e.preventDefault()
를 사용한다.
<a href="https://naver.com" onClick={(e) => e.preventDefault()}>
리액트에서 지원하는 이벤트 종류는 다음과 같다. 다음에서 더 자세한 사항을 확인해볼 수 있다.
상세코드에서 확인할 수 있다.