2017-01-13 3 views
1

私は自分自身をes6 +で紹介していますが、別のコンポーネントに関数の小道具を渡そうとするのは苦労します。React.Componentを使用して別のコンポーネントに関数の小道具を正しく渡すにはどうすればいいですか?

これは私のコードです:

class ProductList extends React.Component { 
    constructor(props) { 
     super(props); 
     this.onVote = this.handleProductUpVote.bind(this); 
    } 
    handleProductUpVote(productId) { 
     console.log(productId +" was upvoted.") 
    } 
    render() { 
     const products = Data.map((product) => { 
      return (
       <Product 
        key={'product-'+product.id} 
        id={product.id} 
        title={product.title} 
        description={product.description} 
        url={product.url} 
        votes={product.votes} 
        submitter_avatar_url={product.submitter_avatar_url} 
        product_image_url={product.product_image_url} 
        onVote={this.handleProductUpVote} 
       /> 

      ); 
     }); 

     return (
      <div className="ui items"> 
       {products} 
      </div> 
     ); 
    } 
} 

私は(製品)このコンポーネントで機能onVoteを渡したい

class Product extends React.Component { 
    handleUpVote() { 
     this.props.onVote(this.props.id).bind(this) /* the error is here, I am trying 
to pass the id props, and invoke the onVote prop here */ 
    } 
    render() { 
     return (
      <div className="item"> 
       <div className="image"> 
        <img src={this.props.product_image_url} /> 
       </div> 
       <div className="middle aligned content"> 
        <div className="description"> 
         <a onClick={this.handleUpVote}> 
          <i className="large caret up icon"/> 
         </a> 
         {this.props.votes} 
        </div> 
        <div className="description"> 
         <a href={this.props.url}> 
         {this.props.title} 
         </a> 
        </div> 
        <div className="extra"> 
         <span> Submitted by: </span> 
         <img 
          className="ui avatar image" 
          src={this.props.submitter_avatar_url} 
         /> 
        </div> 
       </div> 
      </div> 
     ); 
    } 
} 

私はここで他の小道具と何の問題もありません。 handleUpVoteで関数を呼び出そうとしていますが、バインドを使用しましたが、動作させることはできません。助けて?

答えて

1

のようにそれを呼び出します。

コンストラクタでわかるように、すでにバインドされており、this.onVoteプロパティに割り当てられています。

2つの解決策があります。

  1. あなたはrenderメソッドでonVote={this.onVote}を使用する必要があります。
  2. コンストラクタ内のプロパティonVoteの名前をthis.handleProductUpVoteに変更します。そして、あなたはthis.handleProductUpVote = this.handleProductUpVote.bind(this)で終わるとhttp://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/

    アップデートでメソッドをレンダリング(すなわちonVote={this.handleProductUpVote}

詳細情報に割り当てを残す:私はまだ

class Product extends React.Component { 
    constructor(props) { 
     super(props); 
     this.handleUpVote = this.handleUpVote.bind(this); 
    } 
    handleUpVote() { 
     this.props.onVote(this.props.id) 
    } 
    // the render method 
} 
+0

に感謝しています。これは、私がやったことです。 コンストラクタ(小道具){ \t \t super(props); \t \t this.onVote = this.handleProductUpVote.bind(this); \t}と製品コンポーネントにonVote = {this.onVote}、製品のような成分、 handleUpVote(){ \t \t this.props.onVote(this.props.id)で呼び出さ。 \t}、私はまだ「Uncaught TypeError:あなたの答えから、プロパティ '小道具のヌル」を読み取ることができません、私の理解です。あなたは私にそれをする方法を詳しく教えてもらえますか?私は本当に感謝しています –

+0

私は固定された製品コンポーネントの答えを更新しました。間違った方法でhandleUpVoteをバインドしていましたが、これはコンストラクタで行う必要があります。 –

0

はあなたの製品コンポーネントに)(handleUpVoteでバインドを削除し、ちょうどあなたが製品のコンポーネントに渡す際に囲まれたhandleProductUpVoteメソッドを使用する必要がthis.props.onVote(this.props.id);

+0

そして、あなたのProductクラスを更新しますそれに誤りがある。 "Uncaught TypeError:nullのプロパティ 'props'を読み取ることができません –

+0

ああ、Przemyslawが言ったように、あなたのProductListコンポーネントrender()の答えを拡張するために、onVote = {this.onVote}の代わりにonVote = { this.handleProductUpVote} –

+0

これは私がコンストラクタ(小道具){スーパー(小道具; this.onVote = this.handleProductUpVote.bind(this); }と、ProductコンポーネントonVote = {this.onVote}(このようなProductコンポーネントで呼び出されます)、handleUpVote(){this.props.onVote(this.props.id); }、私はまだ "Uncaught TypeError:あなたの答えからnullのプロパティ '小道具'を読むことができません、それは私が理解しているものです。あなたは私にそれをする方法を詳しく教えてもらえますか?私は実際に –

関連する問題