ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021_12_16 React 이벤트 처리하기
    IT/React 2021. 12. 16. 19:18

    공부해야할 것

    1. 합성 이벤트

      1.1. 합성 이벤트 링크 (https://ko.reactjs.org/docs/events.html)

    2. W3C 명세

    3. 공식문서에 적힌 이벤트처리에 대한 바인딩 -> 생성자 함수의 바인딩이 아닌 prototype.bind 였음

     - Function의 스코프 지정할떄와,. 매개변수 고정할 때 사용하는것

     

    - 공식문서 참조

    React 엘리먼트에서 이벤트 처리 방식은 DOM 엘리먼트 이벤트 처리와 유사

    * React는 소문자 대신 캐멀 케이스(camelCase) 이용

     

    // 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 sumbit.');
    }
    
    return (
    	<form onSubmit={handleSubmit}>
    	<button type="submit">Submit</button>
    	</form>
    	);
    }

    위의 인자 e 는 합성 이벤트이다. React는 W3C에 따라 합성 이벤트를 정의하기 떄문에 브라우저 호환성에 대해 걱정할 필요가 없음

    React 이벤트는 브라우저 고유 이벤트와 정확히 동일하게 동작하지 않는다.

    더 자세한 사항은 합성 이벤트를 참고하길 바람

     

    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의 의미에 대해 주의해야한다. js에서 클래스 메서드는 기본적으로 바인딩되어 있지 않다.

    this.handleClick을 바인딩하지 않고 onClick 에 전달했으면 실제 호출될떄는 this는 undefined가 된다.

    * 여기 문장을 곰곰히 생각해봤을때 js 함수는 기본적으로 바인딩을 지원하는데 class는 바인딩을 지원해주지 않는다는 건가?

    * 내가 아는 바인딩은 런타임 이전에 메모리 공간을 확보하는것이다.

     

    이는 React만의 특수한 동작이 아니며 js에서 함수가 작동하는 방식의 일부이다.

    일반적으로 onClick={this.handleClick} 과 같이 뒤에 () 를 사용하지 않고 메서드를 참조할 경우 해당 메서드를 바인딩 해야합니다.

     

    bind를 호출하는 것이 불편하다면 해결 방법은 2가지

    - 실험적인 퍼블릭 클래스 필드 문법 사용 -> 클래스 필드를 사용하여 콜백을 올바르게 바인딩 

     

    실험적인 문법을 사용하면 문제점은 자식쪽에서 추가로 다시 렌더링 할 수있음

    어지간해선 생성자 안에서 바인딩 하자

     

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

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

    예를 들어 id가 행의 ID일 경우 다음 코두가 모두 작동한다.

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

    위 두줄은 동등하며 각각 화살표 함수와 Function.prototype.bind 를 사용한다.

    두 경우 모두 React 이벤트를 나타내는 e 인자가 ID 뒤에 두번째 인자로 전달된다.

    화살표 함수를 사용하면 명시적으로 인자를 전달해야 하지만 bind를 사용할 경우 추가 인자가 자동을 전달됩니다.

    'IT > React' 카테고리의 다른 글

    2022_01_06 React Form  (0) 2022.01.06
    2021_12_30 React 마지막 특강 + 정리  (0) 2021.12.30
    2021_12_26 개발블로그, 기술블로그 제작  (0) 2021.12.27
    2021_12_21 React 특강  (0) 2021.12.22
    2021_12_09 yarn start 에러, 해결, 결론  (0) 2021.12.09
Designed by Tistory.