react에서 오류 질문합니다.

조회수 2582회

이렇게 코드를 짰는 데 Uncaught TypeError: Cannot read property 'bind' of undefined 라고 에러가 뜹니다.

<html>
  <head>
    <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=edge" >
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.4/components/menu.min.css" media="screen" title="no title" charset="utf-8">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.4/components/button.min.css" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.4/components/form.min.css"/>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.js" charset="utf-8"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.js" charset="utf-8"></script>
    <title></title>
  </head>
  <body>
    <header>
      <div class="ui top inverted massive menu">
        <h6 class="header item">Leaduck</h6>
        <a class="item" href="/">홈</a>
        <div class="right menu">
          <div class="item">
            <a href="/users/logout" class="ui primary button large">로그아웃</a>
          </div>
        </div>
      </div>
    </header>
    <div class="container" id="container"></div>
    <script src="/lib/js/comment-es6.js" charset="utf-8" type="text/javascript"></script>
  </body>
</html>
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      title: '',
      text: ''
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChangetitle(event) {
    this.setState({title: event.target.title});
  }

  handleChangetext(event) {
    this.setState({text: event.target.text});
  }

  handleSubmit(event) {
    axios({
      method: 'post',
      url: '/commentpost',
      data: {
        title: this.state.title,
        text: this.state.text
      }
    }).then(function (response) {
      alert('success');
    }).catch(function (error) {
      alert('error');
    });
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
         <div class="ui inverted segment">
           <h1 class="ui left floated header">질문하기</h1>
         </div>
         <div class="ui form">
          <div class="field six wide">
            <label>제목</label>
            <input type="text" class="title" value={this.state.title} onChange={this.handleChangetitle} />
          </div>
          <div class="field six wide">
           <label>내용</label>
           <textarea cols="1" class="text" value={this.state.text} onChange={this.handleChangetext}></textarea>
           </div>
            <br />
            <button onClick="submit()" class="huge ui primary button">질문하기</button>
         </div>
      </form>
    );
  }
}

ReactDOM.render(<App />, document.getElementsById('container'));
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • ES6 클래스를 사용하는 경우 React 는 this를 autobinding 하지 않습니다.

    이 문제를 해결 하는 방법은 여러가지가 있습니다.

    • React.createClass(...)의 사용 : this를 콤포넌트에 자동으로 바인딩해줍니다. 하지만 ES6 클래스의 출현으로 비추천.

    • render() 내에서 직접 바인딩 : 위의 예에서는

     value={this.state.title} onChange={this.handleChangetitle.bind(this)} 
    

    이렇게 사용하면 됩니다. 하지만 rendering을 할때마다 바인딩을 진행하게 되므로 성능에 영향을 미칩니다.

    • 위와 비슷한 방법으로 arrow function을 사용하면 됩니다.
     value={this.state.title} onChange={e => this.handleChangetitle(e)} 
    
    • constructor에 바인딩 :
    constructor(props) {
        super(props);
        this.handleChangetitle.bind(this)
    } 
    

    이런식으로 constructor에 바인딩 하면 되겠네요!

    • 클래스 속성에서 Arrow 함수 사용 : handler 함수를 arrow 함수로 바꿔주면 됩니다.
      handleChangetext = (event) =>  {
        this.setState({text: event.target.text});
      }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)