2017-09-11 6 views
1

<GroupsRow />をクリックしてその呼び出しを関数にすると、インデックスを使用してプロパティを変更できます。しかし、私のクリックは一切起きませんhandler()カスタム要素のハンドラを呼び出そうとしていません

export default class GroupsContainer extends React.Component { 
    constructor(props) { 
    super(props); 
    } 

    handler(index) { 
    console.log(index) 
    } 


    _repeatGroupRows(tags) { 
    return tags.map((tag, index) => 
     <GroupsRow key={index} tag={tag} onClick={this.handler.bind(this, index)} /> 
    ); 
    } 

    render() { 
    return (
     <div className="groups-list-wrapper"> 
     <GroupsHeader /> 
     {this._repeatGroupRows(this.props.state.tags)} 
     </div> 
    ); 
    } 
} 
+0

エラーが発生しますか?私は '_repeatGroupRows'を('コンストラクタ 'の' class 'に)バインドすべきだと思います。これは、 'this.handler'と同様に、パフォーマンスのために –

答えて

3

GroupsRowコンポーネントのコードは投稿していませんが、このコンポーネント内でこのハンドラを呼び出さないとします。
GroupsRowは、通常のDOM要素ではなく反応要素であるため、props.onClickハンドラを呼び出す必要があります。

+1

Upvoted、それは正解です。 – lustoykov

1

map機能は、コンテキストを保存していないので、thisは、あなたが期待するものではありませんし、this.handlerは未定義になります。

mapでもこの正確な目的のために第2引数を受け入れます。これは次のようになります。

EDIT:@lustoykovは、バインドが使用されているために問題ではないという彼の答えには正しいと答えました。私はバインドとthisArgの両方を使用していない多くの人々が見ているように、私の部分にトンネルビジョンのビットが、これは今は問題ではありません!

+1

のパフォーマンスのためにすべてのバインディングをコンストラクタで行うべきですループ内ではなく、renderメソッド(関数の新しいインスタンスを作成する)内にはありません –

+0

私は同意しますが、そのセクションは単なるコピー貼りです。私はmap関数に 'thisArg'引数を追加するだけです。 – gravityplanx

1

あなたは間違った場所を探しています。この例は間違いなく動作しますが、hereは非常によく似たバージョンです。


EDIT:私はSag1vの爪@それを考える - この場合にはonClick<GroupsRow />に渡されるだけプロパティです。コンポーネントのルート要素(おそらく<div />)では、あなたは再びそれを渡す行う必要があるだろう:

<div onClick={this.props.onClick} /> 

PS。 @gravityplanx - map関数のコンテキストは、矢印関数が親のコンテキストを再利用するため、thisコンテキストは必要ありません。

+0

本当に、訂正していただきありがとうございます。 – gravityplanx

+0

私もちょっと離れました:-) – lustoykov

関連する問題