2017-12-23 2 views
0

내 문제는 입력 할 때이 오류가 발생합니다. 누구든지 나를 도울 수 있습니까? THX (내가 BTW 반응에 새로 온 사람)반응 있음 정의되지 않은 'setState'속성을 읽을 수 없음

class Searcher extends Component { 
     constructor(props) { 
     super(props) 

     this.state = { 
      inputValue: '' 
     } 
     } 

     onChange (e) { 
     console.log(e) 
     this.setState({ 
      inputValue: e.target.value 
     }) 
     } 
     render() { 
     return (
      <SearchBar> 
      <SearchInput placeholder="Nunca pares de buscar" value={this.state.inputValue} onChange={this.onChange}/> 
      <SearchContainer> 
       <Search> 
       <i className="fa fa-search" aria-hidden="true"> 
       </i> 
       </Search> 
      </SearchContainer> 
      </SearchBar> 
     ) 
     } 
    } 
+2

는'this.onChange = this.onChange.bind (이) 추가 문제를 해결하기 위해 또 하나 명의 의존성을 추가 할 수 있으며 그 차이를 만드는 경우 생성자에에게'참조하십시오. – Andy

+0

React.Component를 확장에 사용하지 않는 이유는 무엇입니까? 그것은 이유 일 수 있습니다. 또한 생성자 밖의 상태를 설정하여 작동하는지 확인하십시오. – PekosoG

+0

또한 클래스를 어휘 적으로 바인딩하여 생성자에서 모든 메서드 호출을 바인드 할 필요가 없도록 플러그인을 사용할 수 있습니다. [[ "transform-class-properties"]'.babelrc 파일 (webpack 설정의 babel) –

답변

1

createClass과는 달리, 구성 요소 (ES6 클래스)의 경우 React autobind autobind는 this입니다. 그러므로 당신은 당신 스스로 방법을 구속해야합니다.

constructor(props) { 
    super(props); 
    this.state = { inputValue: '' }; 
    this.onChange = this.onChange.bind(this); 
} 

DEMO

그것은 오히려 렌더링 (일부 코드가 표시됩니다으로) 때문에이보다 여기 그것을하는 것이 좋습니다 : 지금까지 가장 일반적인 방법은 생성자의 방법을 결합하는 것입니다 바인딩 된 함수는 한 번만 생성됩니다. 렌더링시 성능 문제가 될 수있는 각각의 새로운 렌더링으로 생성됩니다.

최근 개발자들은 클래스 속성이라는 JavaScript의 실험 기능을 사용하여 생성자없이 이동하여 화살표 함수를 사용하여 방법 :

class Searcher extends Component { 

    state = { inputValue: '' } 

    onChange = (e) => { 
    this.setState({ 
     inputValue: e.target.value 
    }); 
    } 

    ... 

} 

그러나 여기에는 babel to transform these new features during transpilation을 사용해야합니다. 여분의 babel 구성을 추가하는 것이 가치 있다고 생각하지 않는 한, 아마도 생성자에서 바인딩을 고수하는 것이 가장 좋습니다.

+0

정말 고마워요! 이 입력을 제출하여 쿼리를 작성하려면 어떻게해야합니까? –

0

당신은 this.onChange.bind(this)를 사용한다, 또는이는 검색 자 클래스를 참조하지 않습니다.

0

당신은

import autobind from 'autobind-decorator'; 

class Searcher extends Component { 

    state = { inputValue: '' } 

    @autobind 
    onChange(e){ 
    this.setState({ 
     inputValue: e.target.value 
    }); 
    } 

    ... 

} 
관련 문제