React에서 onClick
, onChange
, onSubmit
같은 이벤트는 DOM 이벤트와 관련 있어.
TypeScript를 쓰면 정확한 이벤트 객체 타입을 지정해서 안전하게 접근할 수 있어.
MouseEvent
, ChangeEvent
타입import { ChangeEvent, MouseEvent, useState } from 'react';
const EventExample = () => {
const [value, setValue] = useState('');
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
setValue(e.target.value);
};
const handleClick = (e: MouseEvent<HTMLButtonElement>) => {
alert('클릭됨!');
};
return (
<>
<input type="text" onChange={handleChange} />
<button onClick={handleClick}>클릭</button>
</>
);
};
✅ ChangeEvent<HTMLInputElement>, MouseEvent<HTMLButtonElement>처럼 이벤트 타입과 HTML 요소를 함께 지정하는 게 중요해.
type Props = {
onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
};
const InputButton = ({ onClick, onChange }: Props) => {
return (
<>
<input onChange={onChange} />
<button onClick={onClick}>전송</button>
</>
);
};
✅ 컴포넌트로 핸들러를 전달할 때도 정확한 이벤트 타입을 함께 전달해줘야 안전하게 쓸 수 있어.
const FormSubmit = () => {
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault(); // 새로고침 방지
alert('폼 전송됨');
};
return (
<form onSubmit={handleSubmit}>
<input name="email" />
<button type="submit">제출</button>
</form>
);
};
✅ FormEvent<HTMLFormElement>는 <form> 요소에 대한 이벤트 타입이야.
e.preventDefault()
를 자주 쓰므로 반드시e
타입을 정확히 지정해줘야 해.
type ToggleProps = {
onToggle: (checked: boolean) => void;
};
const Toggle = ({ onToggle }: ToggleProps) => {
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
onToggle(e.target.checked); // 체크 여부만 전달
};
return <input type="checkbox" onChange={handleChange} />;
};
✅ onToggle: (checked: boolean)처럼 커스텀 핸들러를 정의하고 내부에서 추출한 값을 넘겨주는 방식은 매우 일반적이야.