2016-07-22 7 views
0

でこのキーワードは、私は私のdiv要素をクリックすることで、引数としてchangeSong機能通過インデックスを実行する必要がある機能React.js

changeSong: function(index) { 
    this.setState({currentSongIndex: index }; 
} 

あります

var listTemp = data.map(function(item,index) { 

     var listTemp = data.map(function(item,index) { 

     return (
      <div key={index} className="eachTrack" onClick={this.changeSong({index})}> 
       <span className="duration">{item.duration}</span> 
       <a href="#" className="songTemplate" >{item.artist} - {item.track}</a> 

      </div> 
     ) 
    }.bind(this)) 

それはちょうど(のように私のchangeSong機能を3回実行します私がdiv要素を持つように)。今は単に "インデックス"引数を渡すことなく実行しているだけでなく、クリックしてイベントもありません。

var listTemp = data.map(function(item,index) { 
    return (
      <div key={index} className="eachTrack" onClick={this.changeSong({index})}> 
       <span className="duration">{item.duration}</span> 
       <a href="#" className="songTemplate" >{item.artist} - {item.track}</a> 

      </div> 
     ) 
    }.bind(this)) 

や地図機能にこのを渡す::他の人と

var listTemp = data.map(function(item,index) { 
    return (
      <div key={index} className="eachTrack" onClick={this.changeSong({index})}> 
       <span className="duration">{item.duration}</span> 
       <a href="#" className="songTemplate" >{item.artist} - {item.track}</a> 

      </div> 
     ) 
    }, this) 

が指摘している、あなたはchangeSong機能をラップする場合がありますあなたはバインドにこれを必要とする

+1

をごハンドラをラップ?さらに、 'changeSong'関数はレンダリング時に直ちに実行されるので、それ自身が関数を返さない限り、これもまた問題につながります。それを単に矢印の機能で包みます。 – oens

+1

私は@oensが正しい道にあると信じています。答えを提出した後に彼のコメントに気がつきましたが、彼が何を指しているかを説明するかもしれません。 – abigwonderful

答えて

2

描画時に直ちに実行されないように矢印関数で描画します。

<div key={index} className="eachTrack" onClick={() => this.changeSong(index)}> 
+0

ありがとう!それは今ほとんど働いています))ページが準備ができたらchangeSongは3回(div要素を持っている限り)完了しますが、クリックすると何も起こりません。それは単にconsole.log()関数です。私は何が間違っていますか? – congressor

+0

@congressor hmm thatsあなたのコードの残りの部分を見ることなく答えるのは難しいです。 – abigwonderful

+0

入手しました。それは私のchangeSong関数を3回実行するだけですが、indexの引数を持つclickイベントで実行する必要があるので、changeSongを呼び出します:function(index){this.setState({currentSongIndex:index})どうすればいいですか? – congressor

0

プレーンES5 JavaScriptを使用する場合は、関数にthisを明示的にバインドする必要があります。幸いにも、Array.prototype.mapthisコンテキストの第2引数をとります。

var listTemp = data.map(function(item,index) { 

     return (
      <div key={index} className="eachTrack" onClick={this.changeSong({index})}> 
       <span className="duration">{item.duration}</span> 
       <a href="#" className="songTemplate" >{item.artist} - {item.track}</a> 

      </div> 
     ) 
    }, this); // Passes in the parent `this` context to the map callback function 
+0

私の答えよりもはるかに優れた説明と例! – abigwonderful

+1

または矢印の機能を使用することはできません... arr.map((item、index)=> {...}) – Skay

+0

ありがとうとても助けてくれてありがとう! – congressor

1

あなたは.map(...)にcontext引数を供給することによって.bind(...)かを使用してthisためのコンテキストをバインドする必要があります。また、イベントハンドラとして適切な関数を提供していることを確認してください。具体的には、たぶん、あなたは、イベントハンドラのための適切なコンテキストをバインドするのを忘れて、適切にイベントディスパッチ時indexを渡すために、矢印の機能に

<div key={index} className="eachTrack" onClick={() => this.changeSong(index)}> 
+1

ありがとう!本当にありがとう! – congressor