2016-07-22 2 views
0

Там же функцияЭто ключевое слово в React.js

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

мне нужно запустить changeSong функция прохождения индекса в качестве аргумента, нажав на мой DIV

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). Теперь он просто работает, даже не передавая аргумент «index», также нет события по клику.

+1

Может быть, вы забыли привязать нужный контекст для обработчика событий? Кроме того, функция «changeSong» выполняется сразу после визуализации, поэтому, если она сама не возвращает функцию, это также приведет к проблемам. Просто оберните его в функцию стрелки. – oens

+1

Я считаю, что @oens находится на правильном пути. Просто заметил его комментарий после отправки ответа, но он может проиллюстрировать то, о чем он говорит. – abigwonderful

ответ

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> 
     ) 
    }.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 в функции стрелки, чтобы он не выполнялся непосредственно на рендере:

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

большое спасибо! теперь он почти работает сейчас)) Когда страница готова changeSong завершается три раза (столько, сколько у меня есть элементы div), но когда я нажимаю на нее, ничего не происходит. Это просто функция console.log(). Что я могу сделать неправильно? – congressor

+0

@congressor hmm its трудный ответить, не видя остальную часть вашего кода – abigwonderful

+0

Получил это. Он просто запускает мою функцию changeSong 3 раза, но мне нужно, чтобы она запускалась по событию click с аргументом index, поэтому она вызывает changeSong: function (index) {this.setState ({currentSongIndex: index} Как я могу это сделать? – congressor

0

При использовании простого ES5 Javascript вам необходимо явно привязать this к функции. К счастью, Array.prototype.map принимает второй аргумент для контекста 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); // Passes in the parent `this` context to the map callback function 
+0

гораздо лучшее описание и пример, чем мой ответ! – abigwonderful

+1

Или вы можете использовать функцию стрелки, которая не имеет контекста ... arr.map ((item, index) => {...}) – Skay

+0

спасибо очень понравилось! Я очень ценю вашу помощь! – congressor

1

Вы должны связать контекст this с использованием .bind(...) или путем подачи контекста аргумент .map(...). Также убедитесь, что вы выполняете надлежащую функцию в качестве обработчика событий. В частности, обернуть обработчик в функции стрелки, чтобы правильно передать index После отправки события,

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

большое спасибо! Я очень ценю вашу помощь! – congressor

Смежные вопросы