[React 공식사이트] 6. 이벤트 처리하기

Jiseon·2021년 12월 14일
0

이벤트 처리하기


  • React 이벤트는 소문자 대신 캐멀 케이스를 사용한다.
  • JSX를 사용하여 문자열이 아닌 함수로 이벤트 핸들러를 전달한다.
// HTML
<button onclick="activateLasers()">
	Activate Lasers
</button>
// React
<button onClick={activateLasers}>
	Activate Lasers
</button>
  • React에서는 false를 반환해도 기본 동작을 방지할 수 없다.
    반드시 preventDefault를 명시적으로 호출해야 한다.
// HTML
<form onsubmit="console.log('You clicked submit.'); return false">
	<button type="submit">Submit</button>
</form>
// React
function Form(){
	function handleSubmit(e){
    	e.preventDefault();
        console.log('You clicked submit.');
    }
    
    return(
    	<form onSubmit={handleSubmit}>
        	<button type="submit">Submit</button>
        </form>
    );
}

e는 합성 이벤트이다.
React를 사용할 때 DOM 엘리먼트가 생성된 후 리스너를 추가하기 위해 addEventListener를 호출할 필요가 없는 대신 앨리먼트가 처음 렌더링 될 때 리스너를 제공하면 된다.

ES6 클래스를 사용하여 컴포넌트를 정의할 때, 일반적인 패턴은 이벤트 핸들러를 클래스의 메서드로 만드는 것이다. 예) 다음 Toggle 컴포넌트는 사용자가 "ON"과 "OFF" 상태를 토글 할 수 있는 버튼을 렌더링 한다.

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>
        );
    }
}
ReactDOM.render(
	<Toggle />,
    document.getElementById('root')
);

JSX 콜백 안에서 this의 의미에 대해 주의해야 한다. JavaScript에서 클래스 메서드는 기본적으로 바인딩 되어있지 않다. this.handleClick을 바인딩하지 않고 onClick에 전달하면 함수가 실제로 호출될 때 this는 undefined가 된다.

bind를 호출하지 않고 바인딩하는 방법1

  • 클래스 필드를 사용하여 콜백을 바인딩
class Loggingbutton extends React.Component{
	handleClick = () => {
    	console.log('this is', this);
    }
    render(){
    	return(
        	<button onClick={this.handleClick}>
            	Click me
            </button>
        );
    }
}

bind를 호출하지 않고 바인딩하는 방법2

  • 콜백에 화살표 함수를 사용하는 방법
class LoggingButton extends React.Component{
	handleClick(){
    	console.log('this is', this);
    }
    render(){
    	return(
        	<button onClick={() => this.handleClick()}>
            	Click me
            </button>
        );
    }
}

이 문법의 문제점은 LoggingButton이 렌더링 될 때마다 다른 콜백이 생성된다는 점이다.
대부분의 경우 문제가 되지 않으나, 콜백이 하위 컴포넌트에 props로서 전달 된다면 그 컴포넌트들은 추가로 다시 렌더링을 수행할 수도 있다.

이벤트 핸들러에 인자 전달하기

루프 내부에서는 이벤트 핸들러에 추가적인 매개변수를 전달하는 것이 일반적이다.

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>

두 경우 모두 React 이벤트를 나타내는 e인자가 ID뒤에 두번째 인자로 전달된다.
화살표 함수를 사용하면 명시적으로 인자를 전달해야 하지만 bind를 사용할 경우 추가 인자가 자동으로 전달된다.

0개의 댓글