다음은 일반적인 HTML
<button onclick="activateLasers()">
Activated Lasers
</button>
React에서는 다음과 같이 표현한다.
<button onClick={activateLasers}>
Activated Lasers
</button>
또 다른 차이점으로, React에서는 false를 반환해도 기본동작을 막지 않는다. 반드시 preventDefault를 사용해야 한다.
<form onsubmit="console.log('You clicked submit.'); return false">
<button type="submit">Submit</button>
</form>
function Form() {
function handleSubmit(e) {
e.preventDefault();
console.log('You clicked submit.');
}
return (
<form onSubmit={handleSubmit}>
<button type="submit">Submit</button>
</form>
);
}
여기서 e는 합성이벤트를 의미하고 W3C 명세에 따라 정의하기 때문에 브라우저 호환성은 괜찮지만, 정확히 동일하게 동작하지는 않는다.
이벤트 제공은 addEventListener
를 사용하지 않고 렌더링 될 때 리스너를 제공하면 된다. 예를 들어 class를 통해 컴포넌트를 정의하는 경우에는 클래스의 메소드로 제공할 수 있다.
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
// 콜백에서 `this`가 작동하려면 아래와 같이 바인딩 해주어야 합니다.
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
onClick에 직접 handleClick
메소드를 넣을 때, bind()
를 통해 this를 바인딩 해줘야 한다.
바인딩을 직접하는 것 말고 두가지 방법이 있다.
class LoggingButton extends React.Component {
// 이 문법은 `this`가 handleClick 내에서 바인딩되도록 합니다.
// 주의: 이 문법은 *실험적인* 문법입니다.
handleClick = () => {
console.log('this is:', this);
};
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
);
}
}
class LoggingButton extends React.Component {
// 이 문법은 `this`가 handleClick 내에서 바인딩되도록 합니다.
// 주의: 이 문법은 *실험적인* 문법입니다.
handleClick() {
console.log('this is:', this);
};
render() {
return (
<button onClick={() => {this.handleClick()}}>
Click me
</button>
);
}
}