<button onClick={active}></button>
// Type 1
onClick = {function() { ... } }
// Type 2
onClickl = { () => { ... } }
<button onClick = {(function(event) {
console.log(this, event)}.bind(this)}>button</button>
event
객체는 내장 DOM 이벤트 객체를 개선한 것으로 합성 이벤트
이다.bind()
를 하는 이유는 이벤트 핸들러 함수가 리액트 엘리먼트에 대해 참조를 해야하기 때문이다.this
를 이용해서 해당 클래스 참조가 필요 없을 때React.createClass()
를 이용할 때(자동 바인딩이 된다)class LoggingButton extends React.Component {
handleClick() {
console.log("this is:", this);
}
render() {
return (
<button onClick={()=> this.handleClick()}>Click</button>
);
}
}
JSX
에 속성으로 이벤트 선언 (예시 : onClick={handleClick})jQuery
나 일반적인 JavaScript
에서는 DOM노드에 직접 이벤트 리스너
를 연결(addEventListener
)라이프 사이클
에서 이벤트를 추가하거나 제거할 때 문제가 발생합성 이벤트
를 사용한다.합성 이벤트
는 null
이 되어 더 이상 사용할 수 없다.합성 이벤트
를 전역변수
에 담거나 콜백 함수
에 비동기적
으로 사용하려 하겠지만, 기본적으로 이벤트를 비동기 콜백함수나 전역변수에 담아 사용할 수 없다.합성 이벤트
를 유지하려면 event.persist()
메서드를 사용하면 된다.event.persist()
메서드를 실행하면 이벤트 객체가 재사용되지 않아 null
로 처리가 안된다.// 합성이벤트 안티패턴
class Mouse extends React.Component {
handleMouseOver(event) {
window.e = event //안티패턴 - 이벤트 전역변수에 담을 수 없음
setTimeout(() => {
console.table(window.e.target) //안티패턴 - 이벤트 비동기 콜백함수에 담을 수 없음
}, 2345)
}
render() {
return <div>
onMouseOver={this.handleMouseOver.bind(this)}
</div>
}
}
상태변경이 필요하기 때문에 setState()
메서드를 사용한다.
setState()
메서드를 사용하기 위해서는
class
컴포넌트로 구현할 것constructor()
에서 초기값(this.state
)를 설정할 것자바스크립트에서 함수
는 일급 객체이며, 변수나 속성을 전달할 수 있다.
자식 컴포넌트 간의 상호작용이 필요한 경우에는 부모나 컨테이너 컴포넌트에 두는 것이 가장 좋은 방법이다.
하지만, 이벤트가 하나의 자식 컴포넌트에만 영향을 끼친다면, 상위 컴포넌트를 이벤트 처리 메서드로 어지럽힐 필요가 없다.
리액트 컴포넌트의 라이프사이클 이벤트를 사용한다.
componentDidMount()
에서 이벤트 리스너를 추가하고 componentWillUnmount()
에서 컴포넌트가 DOM에서 제거될 때 이벤트도 같이 제거한다.