이벤트 핸들러를 추가하려면 먼저 함수를 정의한 다음 적절한 JSX 태그에 prop으로 전달한다.
Button
컴포넌트 내부에 handleClick
함수를 선언한다.<button>
JSX에 onclick={handleClick}
을 추가한다.export default function Button(){
function handleClick(){
alert('You clicked me!');
}
return(
<button onClick={handleClick}>
Click me
</button>
);
}
handleClick
함수를 정의하고 이를 <button>
에 prop 형태로 전달했다. 여기서 handleClick
은 이벤트 핸들러 이다.
이벤트 핸들러 함수 특징
handle
로 시작하고 그 뒤에 이벤트명을 붙인 함수명을 가진다.이벤트 핸들러를 JSX내에서 인라인으로 정의한 수 있다.
<button onClick={function handleClick() {
alert('You clicked me!');
}}>
또는 화살표 함수를 사용하여 보다 간결하게 정의할 수도 있다.
<button onClick={() => {
alert('You clicked me!');
}}>
이벤트 핸들러로 전달한 함수들은 호출이 아닌 전달되어야 한다.
- <button onClick={handleClick}은 handleClcik 함수를 전달한다.
- <button onClick={() => alert('...')}>은 () => alert('...') 함수를 전달한다.
이벤트 핸들러는 컴포넌트 내부에서 선언되기에 이들은 해당 컴포넌트의 prop에 접근할 수 있다.
function AlertButton({ message, children }) {
return (
<button onClick={() => alert(message)}>
{children}
</button>
);
}
export default function Toolbar() {
return (
<div>
<AlertButton message="Playing!">
Play Movie
</AlertButton>
<AlertButton message="Uploading!">
Upload Image
</AlertButton>
</div>
);
}
Button
컴포넌트를 사용하는 위치에 따라 다른 기능을 수행하도록 만들고자 할 때가 있다. 이러한 기능을 위해서 컴포넌트가 그 부모 컴포넌트로부터 받은 prop을 이벤트 핸들러로 다음과 같이 전달한다.
function Button({ onClick, children }) {
return (
<button onClick={onClick}>
{children}
</button>
);
}
function PlayButton({ movieName }) {
function handlePlayClick() {
alert(`Playing ${movieName}!`);
}
return (
<Button onClick={handlePlayClick}>
Play "{movieName}"
</Button>
);
}
function UploadButton() {
return (
<Button onClick={() => alert('Uploading!')}>
Upload Image
</Button>
);
}
export default function Toolbar() {
return (
<div>
<PlayButton movieName="Kiki's Delivery Service" />
<UploadButton />
</div>
);
}
PlayButton
은 handlePlayClick
을 Button
내 onClick
prop으로 전달한다.UploadButton은 () => alert('Uploading!')
을 Button
내 onClick
prop으로 전달한다.최종적으로, Button
컴포넌트는 onClick
prop을 받습니다. 이후 받은 prop을 브라우저 빌트인 <button>
의 onClick={onClick}
으로 직접 전달한다. 이를 통해 React가 전달받은 함수를 클릭 시점에 호출함을 알 수 있다.
<button>
과 <div>
같은 빌트인 컴포넌트는 onClick
과 같은 브라우저 이벤트 이름 만을 지원한다. 그러나 사용자 정의 컴포넌트에서는 이벤트 핸들러 prop의 이름을 원하는 대로 명명할 수 있다.
관습적으로 이벤트 핸들러 prop의 이름은 on
으로 시작하여 대문자 영문으로 이어진다.
<출처: https://ko.react.dev/learn/responding-to-events#reading-props-in-event-handlers>