이벤트 처리하기

y0ung·2020년 12월 12일
0

React

목록 보기
6/13
post-thumbnail

React 엘리먼트에서 이벤트를 처리하는 방식은 DOM엘리먼트에서 이벤트를 처리하는 방식과 매우 유사하지만 문법차이가 있다.

  • React의 이벤트는 소문자 대신 캐멀케이스를 사용한다.
  • JSX를 사용하여 문자열이 아닌 함수로 이벤트 핸들러를 전달한다.

DOM vs React 이벤트 처리

// HTML
<button onClick="activateLasers()">
  Activate Lasers
</button>

// react
<button onClick={activateLasers}>
    Activate Lasers
</button>

React에서는 반드시 preventDefault를 명시적으로 호출해야 한다.
예를 들면 일반, HTML에서는 새페이지를 여는 링크의 기본 동작을 방지하기 위해 다음과 같은 코드를 작성한다.

<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>

react에서는 다음과 같이 작성한다.

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }
   return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

react에서 리스터를 추가하기 위해 addEventListener를 호출할 필요가 없다. 대신, 엘리먼트가 처음 렌더링될 때 리스너를 제공하면 된다.

이벤트를 활용한 예제

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // 콜백에서 `this`가 작동하려면 아래와 같이 바인딩 해주어야 합니다.
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

자바스크립트에서 클래스 메서드는 기본적으로 바인딩되어 있지 않다. this.handleClick을 바인딩 하지 않고 onClick에 전달하였다면, 함수가 실제 호출될 때 this는 undefined가 된다.

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

루프 내부에서는 이벤트 핸들러에 추가적인 매개변수를 전달한다. id가 행의 ID일 경우 다음 코드가 모두 작동한다.

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

참고

해당 포스팅은 실전 리엑트 공식 홈페이지 https://ko.reactjs.org/
리엑트 자습서 https://ko.reactjs.org/tutorial/tutorial.html 에서 참고하여 작성했습니다.

profile
어제보다는 오늘 더 나은

0개의 댓글