2017-12-04 6 views
1

私はクリック時に名前を変更する簡単な反応コンポーネントを実装しようとしています。私は下のコンポーネントを反応している私のページを読み込んでいる間、エラーの下になっています。 何が間違っていますか?私はJavascriptとReact JSのかなり新しいです。エラーがsetstate行にあるようです。TypeError:これは未定義です - React JS、Javascript

エラー - 例外TypeError:これはあなたがhandleClickメソッドのコンストラクタでこれをバインドする必要が未定義

class Layer5 extends React.Component { 
    constructor(props) { 
    super(props); 

this.state = {buttonstate: false}; 

    } 

    componentDidMount() { 

    } 

    componentWillUnmount() { 

    } 

handleClick(e) { 
e.preventDefault(); 

    this.setState({buttonstate: !this.state.buttonstate}); 


    } 

    render() { 
    var icon = this.state.buttonstate ? 'images/image1.png' : 'images/image2.jpg'; 

    return (

<div className="layer5"> 
    <a href="#" onClick={this.handleClick}><img src={icon} ></img></a> 
</div> 
    ); 
    } 
} 
+0

いずれこれがエラーである - はTypeError:これはライン上の不定 – codinglover

+0

ですか? 'handleClick'にある可能性があります...一般的な解決方法は、' this.handleClick = this.handleClick.bind(this) 'をコンストラクタ内に置くことです。これはイベントハンドラでは「this」が扱いにくいからです。 –

+1

この記事では、長所と短所でこの問題を解決するアプローチ:https://medium.freecodecamp.org/react-binding-patterns-5-approaches-for-handling-this-92c651b5af56 –

答えて

3

a)の矢印の関数を使用して)this(インスタンス上字句閉じプロパティを作成またはb).bindを使用しますか。

どちらか一方を実行してください。 A)

class Layer5 extends React.Component { 
    constructor(props) { 
    super(props); 
    this.handleClick = e => { 
     e.preventDefault(); 

     this.setState({buttonstate: !this.state.buttonstate}); 
    }; 
    } 
} 

またはb)

render() { 
    const icon = this.state.buttonstate ? 'images/image1.png' : 'images/image2.jpg'; 

    return <div className="layer5"> 
     <a href="#" onClick={this.handleClick.bind(this)}> 
      <img src={icon} > 
      </img> 
     </a> 
     </div>; 
    } 
} 
+0

Cool。ありがとうございました! – codinglover

1

です。

constructor(props) { 
     super(props); 

    this.state = {buttonstate: false}; 
    this.handleClick = this.handleClick.bind(this) 
     } 
+0

それは働いた。ありがとう – codinglover

+1

@Dream_cap またはこのパターンをメソッドに使用しますか? レンダリング=()=> { } 私は大きなTypeScriptアプリケーションを持っているので、矢印関数を使用してすべてのオブジェクトメンバーを定義するので、 "bind()"を呼び出す必要はありません。 –

+0

@codinglover答えが助けられた場合は、upv​​ote :) –

関連する問題