2016-03-18 12 views
0

に子供の小道具にアクセスすることができませんがUIを作成するために反応し、私は親コンポーネントと子コンポーネントを持って、これらの線に沿って何か:が反応:私が使用している親のイベントハンドラ

// Child component 
var ListItem = React.createClass({ 
    render: function() { 
    var link_details = (
     <div> 
      Start Date: {this.props.my_data.start_date}<br/> 
      End Date: {this.props.my_data.end_date}<br/> 
     </div> 
    ); 

    return (
     <li> 
      <a onClick={this.props.clickHandler}> 
      { this.props.my_data.name } 
      </a> 
      {link_details} 
     </li> 
    ) 
    } 
}); 

// Parent component 
var Sidebar = React.createClass({ 
    getInitialState: function() { 
    return { 
     my_data: [], 
    }; 
    }, 
    handleListItemClick: function(e){ 
    console.log(e.target); 
    console.log(e.target.props); 
    }, 
    render: function() { 
    var myLinks = this.state.my_data.map(function(mylink) { 
     return (
      <ListItem key={mylink.id} my_data={mylink} clickHandler={this.handleListItemClick} /> 
     ); 
    }.bind(this)); 
    return (
    <div> 
     <ul className="nav nav-sidebar"> 
     { myLinks } 
     </ul> 
    </div>) 
    } 
}); 

を私はクリックをしたいです親のハンドラをトリガーして、親がその子でクリックされた内容に基づいて状態を更新できるようにする。上のコードが動作し、親のハンドラが呼び出されている間、子コンポーネントの小道具にアクセスすることはできません。私はそれが設計であるかどうかわからないし、別の方法で子供から親にデータを渡すか、私が何か間違っているかどうかはわかりません。私はまだReactにはとても新しいので、どんなアドバイスも感謝しています。ありがとう!

var ListItem = React.createClass({ 
    clickItem: function (e) { 
     this.props.clickHandler(e, this.props.my_data); // now you can pass any data to parent 
    }, 
    render: function() { 
    var link_details = (
     <div> 
      Start Date: {this.props.my_data.start_date}<br/> 
      End Date: {this.props.my_data.end_date}<br/> 
     </div> 
    ); 

    return (
     <li> 
      <a onClick={this.clickItem}> 
      { this.props.my_data.name } 
      </a> 
      {link_details} 
     </li> 
    ) 
    } 
}); 

答えて

3

あなたはそれを行うことはできませんが、コールバック

<li> 
    <a onClick={this.props.clickHandler.bind(null,this.props.my_data.name)}> 
    { this.props.my_data.name } 
    </a> 
    {link_details} 
</li> 

または矢印機能を使用して経由して親に子供からのデータを渡すことができますなぜnullを渡すのですか?

覚えておくべきこと: 「this」への自動バインディングメソッドは、コンポーネントがマウントされたときに発生します。

我々が直接気にすることなく、子コンポーネントに機能(例えばthis.clickHandler)を渡すと、子コンポーネント

に親コンポーネントから渡されたコールバックを1.Calling二つの条件

があります。関数が実際に呼び出されたときの値は「this」です。

は、インクルードがあなたの代わりに 『を渡す必要がありますので、( 'この』は、既に結合値を変更しようとしているような)愚かな何かをやってからあなたを停止するのに役立つ独自の機能を備えた標準Function.prototype.bind方法が代わるリアクトnull 'と言って「これは引数を変更するだけであることを理解しています」。

2。

が反応同じコンポーネント内で定義された関数を呼び出すと機能のためにこれを行いませんが、.bindに呼び出すことにより、最初の引数を設定したい場合は、同じコンポーネント内

を結合するための

ルールを呼び出し、関数...

は、propsで渡され、最初の引数としてnullを渡します。 「この」、パス例えば「この」などの最初の引数から取ら

this.props.funcName.bind(null, "args") 

this.funcName.bind(this, "args") 
+0

私はこれを試してみましたが、動作しているようですが、私のコンソールに警告が表示されます: '警告:bind():コンポーネントメソッドを反復するのはコンポーネントインスタンスにのみバインドされます。' '.bind(this、this.props .my_data_name')を '.bind(null、this.props.my_data_name)'に変更すると、エラーは解消されますが、この変更の結果はどういうものかはわかりません。 – Joseph

+0

'{this.props.clickHandler.bind(null、this.props.my_data_name)}'はそれを行う正しい方法です。 – WitVault

+0

答えを編集しました。 – WitVault

1

あなたはそうすることができます。これは、私が興味があると思いワーク・ように見えるん

// Parent component 
var Sidebar = React.createClass({ 
    getInitialState: function() { 
    return { 
     my_data: [], 
    }; 
    }, 
    handleListItemClick: function(data_passed, e){ 
    console.log(data_passed); 
    }, 
    render: function() { 
    var myLinks = this.state.my_data.map(function(mylink) { 
     return (
      <ListItem key={mylink.id} my_data={mylink} clickHandler={this.handleListItemClick.bind(null, mylink.id)} /> 
     ); 
    }.bind(this)); 
    return (
    <div> 
     <ul className="nav nav-sidebar"> 
     { myLinks } 
     </ul> 
    </div>) 
    } 
}); 

他のソリューションを見て、どれが「ベスト」なのか、なぜそれが正しいのでしょうか。あなたは

編集 ES6

<li> 
    <a onClick={() => this.props.clickHandler(this.props.my_data.name)}> 
    { this.props.my_data.name } 
    </a> 
    {link_details} 
</li> 

を使用している場合

+0

また 'onClick = {()=> this.clickHandler(this.props)}' – azium

+0

面白いやり方は、ありがとう!私はこれを私が以下に掲示した答えと比較することに興味があるだろう。これはもう少し時間がかかると思います(子供と親のイベントハンドラが必要です)、私はコードを書くのを好む傾向があります。 – Joseph

+0

はい。 @ WitVaultの答えとは異なり、この解決策はすべてのレンダーパスで新しいハンドラ関数を作成しません。 'clickItem()'関数は一度インスタンス化され、次にすべての 'ListItem'インスタンス間で共有されます。よりパフォーマンスが高く、必要なメモリも少なくてすみます。 – jdunning

0

私はPass props to parent component in React.jsに答えを見ていたし、次のを思い付いた:

+0

そうではありません。ドミトリーが言ったことや、彼の答えに対する私のコメントで言いました。 – azium

+0

あなたはなぜこれではないのか説明できますか?違いは何ですか?なぜこの方法が悪いですか? – Joseph

+1

1)このソリューションは、親(アイテムID)で事前に必要な値を知っているために機能します。しかし、あなたがしていない時代はたくさんあります。あなたの子供の小道具を引数として渡すだけです。はるかに一般的です。 2)もっと重要なことに、 'render'メソッドの中で' bind'を呼び出すと、メモリに100万の新しい関数インスタンスが追加されます。正常な機能を使用するのに最適です – azium

関連する問題