2015-03-19 4 views
2

У меня есть код по следующему URL: https://gist.github.com/motleydev/6d5e980e4d90cc5d52fd, где я создаю настройку типа табуляции. Существует ряд вкладок, раздел содержимого, а затем еще одна строка изображений с переменным активным состоянием в зависимости от того, какая вкладка «открыта». То, что мне в конечном итоге нужно сделать, - это получить индекс вкладки, нажатой, но я не могу понять, как это сделать. Все, что мне нужно, это просто целое число. Цените любое понимание. Благодаря!Получение указателя onClick target с помощью ReactJs

+0

Сделайте еще один компонент, который называется Tab и отправить событие Контейнер OnClick как свойство, а также индекса. Затем вы можете вызвать onClick на фактической вкладке, где вы вызываете OnClick контейнера с правильным индексом. Его грязный, но я думаю, что это сработает. – magnudae

+0

** Я считаю, что ответ заключается в сохранении индекса в элементе HTML и извлечении с помощью e.target или e.currentTarget **, чтобы не связывать функцию каждый раз, когда происходит карта. – neaumusic

+0

http://stackoverflow.com/a/20383295/1487102 – neaumusic

ответ

-1

Jorum solution works.

Вы также можете заменить:

handleClick: function(event){ 
     event.preventDefault(); 
     console.log(this); 
    }, 
    render: function(){ 
     var self = this; 
     var tabs = this.props.tabs.map(function(tab,index){ 
     var clickHandler = self.handleClick; 
     return (<li key={'tab'+index}><a ref={'tab'+index} href="#" onClick={clickHandler} > {tab.meta.title}</a></li>) 
     }); 
     return (
     <nav> 
      <ul> 
      {tabs} 
      </ul> 
     </nav> 
     ) 
    } 
    }); 

By:

handleClick: function(index){ 
     event.preventDefault(); 
     console.log(this); 
    }, 
    render: function(){ 
     var self = this; 
     var tabs = this.props.tabs.map(function(tab,index){ 
     var clickHandler = self.handleClick.bind(null,index); 
     return (<li key={'tab'+index}><a ref={'tab'+index} href="#" onClick={clickHandler} > {tab.meta.title}</a></li>) 
     }); 
     return (
     <nav> 
      <ul> 
      {tabs} 
      </ul> 
     </nav> 
     ) 
    } 
    }); 
+0

, так что я собираюсь дать вам кредит, потому что это работающее решение с меньшим количеством кода, хотя я также ценю решение Jorums. Сначала я пытался использовать «вкус» этого решения, но каждый раз, когда я пытался передать «это» в первый параграф связывания вместо нулевого объекта, он продолжал говорить: «реагируйте на это, перестань делать это сами» или что-то в этом духе. почему он работает с нулевым объектом и делает ли событие просто переданным независимо? – motleydev

+0

У меня тоже была эта проблема. Это связано с тем, что React не хочет, чтобы вы меняли контекст вызова метода (даже если вы привязываетесь к уже привязанному компоненту, который немного странный), и только привязка к null не изменяет контекст. В качестве альтернативы вы можете использовать _.partial from underscore/lodash –

+0

Я пытаюсь использовать этот подход, и индекс проходит отлично. Однако «это» в моем обработчике кликов теперь является нулевым, и мне нужно иметь возможность установить состояние в обработчике кликов через обычные средства -> this.setState ({...}), потому что «this» имеет значение null. – eponymous23

8

Я не могу проверить это в настоящее время, но что-то вроде этого. В основном отправьте обратный вызов и индекс на каждую отдельную вкладку. При нажатии на вкладку выполните обратный вызов с индексом в качестве параметра:

var Tab = React.createClass({ 
    handleClick: function (event) { 
    event.preventDefault(); 
    this.props.tabClicked(this.props.index); 
    }, 
    render: function() { 
    return (
     <li> 
     <a href="#" onClick={this.handleClick}>Tab {this.props.index}</a> 
     </li> 
    ); 
    } 
}); 

var Tabs = React.createClass({ 
    handleClick: function (index) { 
    console.log('Tab #' + index); 
    }, 
    render: function(){ 
    var self = this; 
    var tabs = this.props.tabs.map(function (tab, index) { 
     return (
     <Tab key={index} index={index} tabClicked={this.handleClick} /> 
    ) 
    }); 

    return (
     <nav> 
     <ul> 
      {tabs} 
     </ul> 
     </nav> 
    ); 
    } 
}); 
+0

Это ответ, сохраните 'данные' на элементе – neaumusic

+0

http://stackoverflow.com/a/20383295/1487102 – neaumusic

+0

Это правильный ответ. Также вы можете создать обертку для захвата события и передать его родительскому элементу с элементом данных. Вы можете проверить этот скрипт https://jsfiddle.net/parthapal33/cydubbxh/ –

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