2016-12-01 3 views
0

Я пытаюсь создать таблицу и отобразить некоторые строки с возможностью иметь «скрытую» строку.Создание события onClick в React

Вот что я пытаюсь сделать:

var Child = React.createClass({ 
    render: function() { 
     return(
      <tr> 
       <td colSpan="8"> I am a child that can be hidden!</td> 
      </tr> 
     ) 
    } 
}) 


var CreateRows = React.createClass({ 
    getInitialState: function() { 
     return {childVisible: true} 
    }, 

    render: function(){ 
     var rows = this.props.people.map(function(row, i){ 
      return (
       <tr key={i} onClick={this.onClick}>  
        <td>{row['id']}</td> 
       </tr> 
       { 
        this.state.childVisible 
        ? <Child /> 
        : null 
       } 
      ) 
     }) 
     return (
      <tbody> 
       {rows} 
      </tbody> 
     ) 
    }, 

    onClick: function(){ 
     this.setState({childVisible: !this.setstate.childVisible}) 
    } 
}); 

Я звоню в другом компоненте CreateRows и посылая ему некоторые данные:

render: function(){ 
     return (
      <div> 
       <ChangeRowCount updatePeople = {this.updatePeople}/> 
       <table> 
        <CreateColumns columns={this.state.table_columns} /> 
        <CreateRows people = {this.state.people}/> 
       </table> 
      </div> 
     ) 
    } 

Я понимаю, что мой вопрос заключается в том, что когда я создаю переменная rows Я включаю функцию onClick(), но она не может «увидеть» ее и получить эту ошибку:

Uncaught (in promise) TypeError: Cannot read property 'onClick' of undefined(…)

Любые мысли о том, как я могу включить функцию onClick() для отображения/скрытия компонента Child?

Спасибо!

ответ

0

youre видя эту ошибку, потому что вы вызываете this.onClick внутри функции карты. вам необходимо установить контекст функции карты, передавая this в качестве второго аргумента

var rows = this.props.people.map(function(row, i){ 
     return (
      <tr key={i} onClick={this.onClick}>  
       <td>{row['id']}</td> 
      </tr> 
      { 
       this.state.childVisible 
       ? <Child /> 
       : null 
      } 
     ) 
    }, this) 

смотрите раздел из the documentationthisArg на карте функции

+0

Ahh ок. Кроме того, я получаю «Неожиданный токен (133: 16) (...)», который указывает на {this.state.child.Visible} ... любую идею на этом? –

+0

Я помету это как правильно в 4 минуты, когда я это позволю. –

+0

вы можете вернуть только одно, так что tr и trernary statement нужно обернуть в один элемент. Я не уверен, что происходит с ошибкой, но если я должен был догадаться, что это просто сделать для форматирования. если вы обрушиваете это на одну строку, он все равно даст вам ошибку – PhilVarg

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