웹브라우저에서 이벤트 요소는 유저와의 상호작용에서 뺄래야 뺼 수 없는 중요한 요소이다. 정말 정말 자주 사용하는 마우스, 키보드 이벤트 외에도 다양한 이벤트가 있고 적재 적소에 활용한다면 좋은 UI/UX 를 만들 수 있을것이다. 😎
이벤트란? 유저가 웹 브라우저에서 DOM 요소와 상호작용 하는 모든것을 말한다.
자바스크립트 네이티브 이벤트(Event) 객체를 감싸는 리액트 객체이다. 네이티브 이벤트 인터페이스가 같으므로 순수 자바스크립트에서 HTML 이벤트를 다룰 때와 똑같이 사용한다.
클래스형 컴포넌트
// 1번 생성자에 의해
class ClickButton extends Component {
constructor() {
this.handleClick = this.handleClick.bind(this);
}
function handleClick() {
console.log('Button clicked!');
alert('Button clicked!');
};
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me!</button>
</div>
);
}
}
export default ClickButton;
// 화살표 함수를 이용
class ClickButton extends Component {
handleClick = () => {
console.log('Button clicked!');
alert('Button clicked!');
};
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me!</button>
</div>
);
}
}
export default ClickButton;
this는 함수를 호출하는 방법에 따라 결정되는 객체를 참조한다. 즉, this는 현재 실행 중(런타임)인 코드의 실행 컨텍스트에 따라 값이 결정된다.this를 상속받아 사용한다.
- 렉시컬 스코프(Lexical Scope)란? 코드를 작성한 위치(문법적 구조)에 따라 변수의 유효 범위를 결정하는 방식이다.
대부분의 현대 프로그래밍 언어는 렉시컬 스코핑을 사용한다.
즉, 어디서 호출되었는지가 아니라, 어디서 정의되었는지에 따라 스코프가 결정된다.- 다이나믹 스코프(Dynamic Scope)란? 다이나믹 스코프는 함수가 호출된 시점의 실행 컨텍스트를 기반으로 스코프를 결정하는 방식이다. 즉 런타임에 따라 변수 참조가 달라질 수 있다.
함수형 컴포넌트
const ClickButton = () => {
// 함수형 형태
const handleClick = () => {
console.log('Button clicked!');
alert('Button clicked!');
};
return (
<div>
<button onClick={handleClick}>Click Me!</button>
</div>
);
};
<input>, <textarea>onCopy 사용자가 복사(Copy) 동작을 수행할 때 발생하는 이벤트onCut 사용자가 잘라내기(Cut) 동작을 수행할 때 발생하는 이벤트onPaste 사용자가 붙여넣기(Paste) 동작을 수행할 때 발생하는 이벤트<input>, <textarea>onCompositionStart 입력 조합이 시작될 때 발생 (예: ㅎ)onCompositionUpdate 입력 조합이 진행 중일 때 발생 (예: 하)onCompositionEnd 입력 조합이 완료될 때 발생 (예: 한)<input>, <textarea>onKeyDown 키가 눌릴 때 발생하는 이벤트onKeyPress 키 입력 시 발생하는 이벤트 (Deprecated, onKeyDown 사용 권장)onKeyUp 키를 뗄 때 발생하는 이벤트// 키 조합 동작 구현 (Ctrl + S)
function App() {
const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
if (event.ctrlKey && event.key === 's') {
event.preventDefault(); // 기본 동작 방지
alert('Ctrl + S 키가 눌렸습니다!');
}
};
return (
<div
tabIndex={0}
onKeyDown={handleKeyDown}>
Ctrl+S를 눌러보세요
</div>
);
}
<input>, <textarea>, <select>, <button> onFocus 요소에서 포커스가 맞춰질 때 발생하는 이벤트onBlur 요소에서 포커스가 벗어날 때 발생하는 이벤트<form>, <input>, <textarea>, <select> onChange 폼 요소가 입력 또는 선택에 의해 값이 변경될때 발생하는 이벤트onInput 사용자가 입력하는 즉시 발생onInvalid HTML5 폼 검증에서 유효성 검사 실패 시 발생onReset 폼이 리셋될 때 발생onSubmit 폼이 제출될 때 발생
onInvalid는 HTML5 유효성 검사 속성과 함께 작동한다.
required: 필수 입력
min, max: 숫자 범위 제한.
minLength, maxLength: 문자열 길이 제한.
pattern: 정규식을 사용한 입력 형식 제한.
<img>, <script>, <link>onError 이미지나 스크립트, 비디오 등에서 리소스를 찾지 못하거나 로드하지 못할 경우 발생하는 이벤트onLoad 이미지, 스크립트, 스타일 등에서 리소스가 완전히 로드된 경우 발생하는 이벤트<button>, <div>, <span>, <a>onClick 마우스 버튼을 클릭할 때 발생onContextMenu 마우스 우클릭(컨텍스트 메뉴 열기) 시 발생onDoubleClick 마우스를 두 번 클릭할 때 발생onDrag 드래그가 시작될 때부터 진행 중일 때까지 발생onDragStart 드래그가 시작될 때 발생onDragEnd 드래그가 끝났을 때 발생onDragEnter 드래그 중 요소에 들어왔을 때 발생onDragLeave 드래그 중 요소에서 벗어났을 때 발생onDragOver 드래그 중인 요소가 다른 요소 위에 있을 때 발생onDrop 드래그 중인 요소가 다른 요소 위에 드롭될 때 발생onMouseDown 마우스 버튼을 누를 때 발생onMouseEnter 마우스가 요소에 들어올 때 발생onMouseLeave 마우스가 요소에 벗어날 때 발생onMouseMove 마우스가 요소 안에서 이동할 때마다 발생onMouseOut 마우스가 요소 바깥으로 이동할 때 발생onMouseOver 마우스가 요소 위로 올라갈 때 발생. (하위 요소 포함, onMouseEnter와 다르게, 자식 요소에 진입해도 이벤트 발생)onMouseUp 마우스 버튼을 눌렀다가 뗄 때 발생onTouchCancel 터치 이벤트가 시스템에 의해 취소될 때 발생 (예, 전화수신, 다른 앱 활성화)onTouchEnd 사용자가 화면에서 손가락을 뗄 때 발생onTouchMove 사용자가 터치한 손가락을 움직일 때 발생onTouchStart 사용자가 화면을 터치하기 시작할 때 발생Mouse Events와 Touch Events를 통합한 이벤트 시스템으로, 모든 입력 장치를 포괄적으로 다룰 수 있음onPointerDown 포인터(마우스, 터치 등)가 요소를 누를 때 발생onPointerMove 포인터가 요소 위에서 이동할 때 발생onPointerUp 포인터가 눌린 상태에서 뗄 때 발생onPointerCancel 포인터 동작이 시스템에 의해 취소될 때 발생 (예: 터치 이벤트 중 다른 앱 실행)onGotPointerCapture 요소가 포인터 캡처(즉, 모든 포인터 이벤트를 해당 요소로 전달)를 획득할 때 발생onLostPointerCapture 요소가 포인터 캡처를 잃을 때 발생onPointerEnter 포인터가 요소에 들어올 때 발생 (버블링되지 않음onPointerLeave 포인터가 요소를 벗어날 때 발생 (버블링되지 않음)onPointerOver 포인터가 요소 위로 올라갈 때 발생 (하위 요소 포함)onPointerOut 포인터가 요소 바깥으로 이동할 때 발생 (하위 요소 포함)<input>, <textarea>onSelect 사용자가 텍스트를 선택했을 때 발생하는 이벤트 (마우스로 드래그하거나 키보드로 텍스트를 선택할 때 발생함)onScroll 사용자가 스크롤 동작을 수행할 때 발생하는 이벤트onWheel 이벤트는 사용자가 마우스 휠을 스크롤하거나 터치패드로 스크롤 동작을 수행할 때 발생.onAnimationStart CSS 애니메이션이 시작될 때 발생onAnimationEnd CSS 애니메이션이 종료될 때 발생onAnimationIteration CSS 애니메이션이 한 번 반복될 때마다 발생onTransitionEnd CSS 트랜지션이 끝났을 때 발생onToggle onToggle 이벤트는 HTML5 details 요소가 열리거나 닫힐 때 발생자세한 사항은 아래 링크를 통해 확인가능하다.
SyntheticEvent 공식문서 링크
onClick, onChange 등에서 적용된다.function App() {
const handleDivClick = () => {
console.log('부모 <div> 클릭');
};
const handleButtonClick = () => {
console.log('자식 <button> 클릭');
};
return (
<div onClick={handleDivClick}>
<button onClick={handleButtonClick}>클릭</button>
</div>
);
}
Console 결과
자식 <button> 클릭
부모 <div> 클릭
onClickCapture와 같은 Capture 이벤트를 사용해야 함function App() {
const handleDivClick = () => {
console.log('부모 <div> 클릭 (캡처)');
};
const handleButtonClick = () => {
console.log('자식 <button> 클릭');
};
return (
<div onClickCapture={handleDivClick}>
<button onClick={handleButtonClick}>클릭</button>
</div>
);
}
Console 결과
부모 <div> 클릭 (캡처)
자식 <button> 클릭
stopPropagation 이벤트가 부모로 전파되지 않도록 중단function App() {
const handleDivClick = () => {
console.log('부모 <div> 클릭');
};
const handleButtonClick = (event: React.MouseEvent) => {
event.stopPropagation(); // 부모로 전파 중단
console.log('자식 <button> 클릭');
};
return (
<div onClick={handleDivClick}>
<button onClick={handleButtonClick}>클릭</button>
</div>
);
}
Console 결과
자식 <button> 클릭
preventDefault 커스텀 동작을 정의하거나 기본 동작을 비활성화 하기위한 기본 동작(예: 링크 이동, 폼 제출)을 막기 위해 사용function App() {
const handleLinkClick = (event: React.MouseEvent) => {
event.preventDefault(); // 링크 이동 막기
console.log('커스텀 동작 실행');
};
return <a href="https://example.com" onClick={handleLinkClick}>링크</a>;
}