programming/React

React. 이벤트

dmchoi 2021. 2. 18. 23:52

 

이벤트 state props 그리고 render 함수

props, state, event 가 서로 상호작용하여 애플리케이션의 역동성을 만듦

 

리액트에서 props나 state 값이 바뀌면 그 state를 가지고 있는 컴포넌트의 render 함수가 다시 호출되고 그 하위 컴포넌트들의 render 함수들도 다시 호출됨 (render 함수 : 어떤 html을 그릴것인가 결정하는 함수)

 

이벤트 설치

a 태그를 클릭하면 onClick에 설치된 함수가 실행되도록 함

<h1><a href="/" onClick={function(e){
            
          }}>{this.state.subject.title}</a></h1>

 

function에 e라는 인자를 줌으로써 이벤트를 핸들링 할수 있게 해줌
e.preventDefault( ) : 이벤트가 발생한 태그가 기본적인 동작 방법을 하지 않게 만들어 줌

 

<h1><a href="/" onClick={function(){
            e.preventDefault();
            this.setState({
            mode : 'welcome'
            });
          }.bind(this)}>{this.state.subject.title}</a></h1>
          {this.state.subject.sub}

 

a 태그를 클릭하면 화면이 리로드 되는 기본 동작을 하지 않고 this.state.mode 값이 welcome으로 바뀐다.

 

그런데 this.state.mode =’welcome’ 에서 오류가 발생

 

1. 이벤트가 호출됐을 때 실행되는 함수 안에서는 this의 값이 컴포넌트 자기 자신을 가르키지 않고 아무 값도 세팅되어있지 않음

-> 이벤트를 설치할 때 this를 찾을수 없어서 에러가 발생하면 함수 끝난 직후에 .bind(this)를 추가해주면 됨

 

2. 동적으로 state를 바꿀 때는 this.setState( )에 객체 형태로 통해서 바꿔야 함

this.state.mode = 'welcome' ; 이렇게 하면 리액트 입장에서는 몰래 바꾼셈. 값이 바뀌었는지 모름

(* constructer에서는 평소대로 바꿔도 상관없다.)

 

컴포넌트 이벤트 만들기

링크를 클릭했을 때 이벤트를 설치하고 싶다면 함수를 호출하게 하면됨

onChangePage라는 함수를 만듦

 

App.js

  <Subject title={this.state.subject.title}
          sub={this.state.subject.sub}
          onChangePage = {function(){
           	this.setState({mode : ‘welcome’});
          }.bind(this)}
          >
  </Subject>

 

subject라는 컴포넌트에 onChagePage라는 이벤트를 만들고 함수를 설치함

 

 

Subject.js

class Subject extends Component {
    render() {
      return (
        <header>
          <h1><a href="/" onClick ={function(e){
          e.preventDefault();
          this.props.onChangePage(); //링크를 클릭했을때 onChangePage 함수를 호출
          }.bind(this)}>{this.props.title}</a></h1>
        {this.props.sub}
        </header>
      );
    }
  }

  export default Subject;

 

이벤트를 발생해줬을 때(링크를 클릭 했을 때) props로 전달된 onChagePage 함수를 호출

 

결과 : Subject 컴포넌트를 클릭하면 App 컴포넌트의 state 의 mode 값이 ‘welcome’으로 바뀌면서 화면도 바뀜

 

TOC.js

class TOC extends Component {
  render() {
    var lists = [];
    var data = this.props.data;
    var i = 0;
    while (i < data.length) {
      lists.push(<li key={data[i].id}>
        <a
          href={"/content/" + data[i].id}
          data-id={data[i].id}
          onClick={function (e) {
            e.preventDefault();
            console.log(e.target.dataset.id);
            this.props.onChangePage(e.target.dataset.id); //onChangePage 함수 호출에 id를 매개변수로 넣어줌
          }.bind(this)}
        >{data[i].title}</a></li>);
      i = i + 1;
    }
    return (
      <nav>
        <ul>
          {lists}
        </ul>
      </nav>
    )
  }
}

 

1. data-id:

event 객체는 target이라는 속성이 있고 target은 이벤트가 발생한 태그를 가리킴. 여기선 a태그

data- 접두사로 시작되는 속성은 dataset이라는 속성으로 접근 할 수 있다.  

e.target.dataset.id 로 data-id를 찾을 수 있다.

 

2. bind(this, id)

bind(this, 두 번째 인자)를 주게 되면 두 번째 인자로 들어온 값을 function( )에 첫 번째 인자가 된다. function(id, e)

 

class TOC extends Component {
  render() {
    var lists = [];
    var data = this.props.data;
    var i = 0;
    while (i < data.length) {
      lists.push(<li key={data[i].id}>
        <a
          href={"/content/" + data[i].id}
          data-id={data[i].id}
          onClick={function (id,e) {
            e.preventDefault();
            this.props.onChangePage(id);
          }.bind(this, data[i].id)}
        >{data[i].title}</a></li>);
      i = i + 1;
    }
    return (
      <nav>
        <ul>
          {lists}
        </ul>
      </nav>
    )
  }
}

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

useEffect  (0) 2021.08.03
클래스형 컴포넌트 vs 함수형 컴포넌트  (0) 2021.08.02
React. Create 구현  (0) 2021.03.18
React. 컴포넌트 만들기, Props, state  (0) 2021.02.18
React. 리액트 입문  (1) 2021.02.17