React의 이벤트 시스템은 표준 DOM 이벤트와 유사하지만 몇 가지 중요한 차이점이 있습니다.
onclick, onchangeonClick, onChange<button><button onClick={handleClick}>addEventListener 미사용: addEventListener를 직접 호출하여 DOM 요소에 리스너를 추가할 필요 없이, JSX를 통해 이벤트 핸들러를 선언적으로 연결합니다.SyntheticEvent라는 래퍼(wrapper)로 감싸서 전달합니다. 이는 브라우저 간의 이벤트 동작 차이를 정규화하여 일관된 API를 제공합니다.onInput 대신 onChange: React에서는 입력 필드의 값이 변경될 때 onInput 대신 onChange 이벤트를 사용하는 것을 권장합니다. 이는 onInput과 동일하게 작동하지만, React의 제어 컴포넌트(controlled component) 패턴에 더 적합합니다.아래 예제 코드들은 다음과 같은 디렉토리 구조를 기반으로 작성되었습니다.
📁 src/
├── 🎨 index.css
├── ⚛️ main.jsx
├── ⚛️ App.jsx
└── 📁 components/
└── 📁EventHandling/
├── ⚛️ OnClick.jsx
├── ⚛️ OnChange.jsx
└── ⚛️ OnSubmit.jsx
onClick 이벤트onClick 이벤트는 사용자가 버튼, div 등 특정 요소를 클릭했을 때 발생하는 이벤트를 처리합니다.
파라미터가 없는 함수를 호출할 때는 함수 이름만 전달합니다.
핸들러 함수에 파라미터를 전달해야 할 경우, 화살표 함수(() => {})를 사용하여 함수를 감싸야 합니다. 이렇게 하지 않으면 컴포넌트가 렌더링될 때 함수가 즉시 실행되어 버립니다.
// /src/components/EventHandling/OnClick.jsx
export default function OnClick() {
// 파라미터가 없는 함수
function helloClick() {
alert("Hello, World!");
}
// 파라미터가 있는 함수
function handleClick(buttonName) {
alert(`${buttonName} 클릭`);
}
return (
<div>
{/* 파라미터 없는 함수 호출 */}
<div onClick={helloClick}>Hello, World!</div>
{/* 파라미터 있는 함수 호출 */}
<button onClick={() => handleClick("1번 버튼")}>1번 버튼</button>
<button onClick={() => handleClick("2번 버튼")}>2번 버튼</button>
<button onClick={() => handleClick("3번 버튼")}>3번 버튼</button>
</div>
);
}
onChange 이벤트onChange 이벤트는 <input>, <textarea>, <select>와 같은 폼 요소의 값이 변경될 때 발생합니다. 사용자의 입력을 실시간으로 추적하고 상태(state)를 업데이트하는 데 주로 사용됩니다.
이벤트 핸들러는 이벤트 객체(event)를 인자로 받으며, event.target.value를 통해 현재 입력 값을 가져올 수 있습니다.
// /src/components/EventHandling/OnChange.jsx
export default function OnChange() {
const handleChange = (event) => {
console.log(`입력 이벤트 발생, 입력 값: ${event.target.value}`);
};
return (
<div>
<input type="text" onChange={handleChange} />
</div>
);
}
onSubmit 이벤트onSubmit 이벤트는 <form> 요소 내부에서 type="submit"인 버튼을 클릭하거나, 입력 필드에서 Enter 키를 눌렀을 때 발생합니다.
event.preventDefault()폼 제출 시 기본적으로 페이지가 새로고침됩니다. 이를 방지하고 JavaScript로 폼 데이터를 처리하려면 event.preventDefault()를 반드시 호출해야 합니다.
React 앱은 SPA(Single Page Application) 구조로 동작합니다.
즉, 한 번 로드된 후에는 JavaScript가 상태(state)와 라우팅을 제어합니다.
만약 폼 제출 시 새로고침이 일어나면:
• React 앱 전체가 다시 초기화되어 버립니다.
• state가 초기화되고, 렌더링 흐름이 깨집니다.
• 원하는 로직(예: 콘솔 출력, API 요청) 대신 브라우저가 페이지 이동을 처리합니다.
따라서 React에서는 event.preventDefault()를 호출하여:
• 브라우저의 기본 동작(페이지 리로드 및 자동 요청 전송)을 막습니다.
• 대신, 개발자가 지정한 커스텀 로직(handleSubmit)만 실행되도록 합니다.
• 예: 입력 값 확인, 유효성 검증, fetch/axios를 통한 API 요청 등
event.target.elements를 통해 폼 안의 모든 입력 요소(input, textarea 등)에 접근할 수 있습니다. 각 요소의 name 속성을 키로 사용하여 값을 가져올 수 있습니다.
// /src/components/EventHandling/OnSubmit.jsx
export default function OnSubmit() {
const handleSubmit = (event) => {
// 폼 제출 시 기본 동작(페이지 새로고침) 방지
event.preventDefault();
// event.target은 form 요소를 가리킴
// event.target.elements : form 요소의 모든 입력 요소들
const elements = event.target.elements;
// 구조 분해 할당을 활용하여 각 요소를 변수에 할당
const { email, password, name } = elements;
// 각 입력 요소의 값(value)에 접근
console.log(`이메일 입력 값: ${email.value}`);
console.log(`비밀번호 입력 값: ${password.value}`);
console.log(`이름 입력 값: ${name.value}`);
};
return (
<div>
<form onSubmit={handleSubmit}>
<input type="email" name="email" placeholder="Email" />
<input type="password" name="password" placeholder="Password" />
<input type="text" name="name" placeholder="Name" />
<button type="submit">Submit</button>
</form>
</div>
);
}
onClick)를 사용합니다.{handleClick})를 전달합니다.{() => handleClick(param)})를 사용합니다.event.preventDefault()를 호출하여 페이지 새로고침을 막습니다.SyntheticEvent 객체를 사용합니다.