2015-09-18 14 views
6

私はonClickイベントのコールバックを子要素に渡す非常に単純なReactコンポーネントを持っています。ただし、onClickイベントは発生しません。クラスは以下の通りですHamburgerMenuHamburgerは正しくインポート/レンダリングされ、これらのコンポーネントにイベントが存在しません。関数が子に渡されたときにonClickイベントが発生しないようにします

export default class AppHandler extends React.Component { 
    componentWillMount() { 
    this.state = { 
     menuOpen: false 
    }; 
    } 
    render() { 
    return (
     <div> 
     <HamburgerMenu menuOpen={this.state.menuOpen} /> 
     <div className="content"> 
      <nav> 
      <Hamburger onClick={this.onMenuChange.bind(this)} /> 
      </nav> 
     </div> 
     </div> 
    ); 
    } 
    onMenuChange() { 
    console.log('onMenuChanged'); 
    this.setState({ menuOpen: !this.menuOpen }); 
    } 
}; 

私はHamburgerコンポーネントで、私はルート要素上の別のonClickイベントを設定し、そのイベントハンドラとしてthis.props.onClickを設定した場合、それは仕事を得ることができますが、それは私がのこぎりを持っているすべてのものから、不要だように、それはそうです。

ガイダンスはありますか?ありがとうございました!あなたはES6クラスをエクスポートし、createClassを使用していないので

+0

「this.onMenuChange.bind(this)」にする必要がありますが、少なくともクリックするとコンソールエラーが発生します。クリックするとコンソールエラーが発生しないと確信していますか? – loganfsmyth

+0

実際に 'Hamburger'コンポーネントの' onClick'にバインドされているものがありますが、実際には 'onMenuChange'はまだ呼び出されていません。実際に何かがバインドされているのでエラーは発生しませんが、バインドされているものはすべて正しくありません。 – BenM

答えて

9

だから、これはonClickイベントが添付なっているところ理解していない私になってしまうんでした。 onClick={this.onMenuChange(this)}を設定すると、コンポーネントそのものは実際の要素ではないので、子要素Hamburgerの場合はprop.onClickと設定します。バインドを実際に動作させるには、に設定し、Hamburgerコンポーネントのルート要素にonClick={this.props.onClick}を設定する必要があります。

-1

、あなたはthisにハンドラをバインドする必要があります。

<Hamburger onClick={this.onMenuChange.bind(this)} /> 

なぜすぐにno autobinding上のドキュメントを反応させるのを参照してください:

メソッドが続きます通常のES6クラスと同じセマンティクスです。つまり、自動的にこれをインスタンスにバインドしません。 .bind(this)または矢印関数=>を明示的に使用する必要があります。

また、あなたの状態にエラーがあります。 this.setState({ menuOpen: !this.menuOpen });this.state.menuOpenに設定されますが、propに変異を導入していないため、ここでは変更されません:<HamburgerMenu menuOpen={this.menuOpen} />

その行は次のようになります。

<HamburgerMenu menuOpen={this.state.menuOpen} /> 

// and you should set a default state as well 

// in AppHandler 
componentWillMount() { 
    this.state = { 
    menuOpen: this.props.menuOpen 
    }; 
} 
+0

状態を修正していただきありがとうございますが、 'onClick'を' this'にバインドしても、onMenuChange関数は呼び出されません。 実際にはReactの開発ツールを使ってイベントに盲目的な機能があるとわかりましたが、今まで呼ばれたことはありません。 – BenM

+0

@BenMと呼ばれています。私の答えの2番目の部分を読んでください。 'menuOpen = {this.state.menuOpen}'を使用して状態を変更する必要があります。 –

+0

誤ってセットアップ状態に関する部分が表示されますが、これはonMenuChangeイベントを使用してコンソールにログを記録しているため出力されません。'onClick'がまだ起動しない場合、修正を含めるようにサンプルを更新しました。 – BenM

0

コンポーネントを使用しているときにthisをバインドする必要はありません。を<Hamburger />コンポーネントにバインドするだけで十分です。次のサンプルコードを参照してください

import React from 'react'; 
import Button from 'components/Button'; 

class App extends React.Component { 
    handleClick(e){ 
    console.log(e.target); 
    } 

    render(){ 
    return (
     <Button Text="Save" onClick={this.handleClick} /> 
    ); 
    } 
} 

//Button Component 
class Button extends React.Component { 
    clickEventHandler(e) { 
     this.props.onClick(e); 
    } 
    render(){ 
    return (
     <button onClick="this.clickEventHandler.bind(this)">{this.props.Text}</button> 
    ); 
    } 
} 
関連する問題