2015-07-22 2 views
4

В качестве примера я использовал статью this (React way), но она не работает для меня. Пожалуйста, укажите мне мою ошибку, поскольку я не могу понять, что случилось.React.js: onClick function from child to parent

Это ошибка я вижу:

Uncaught TypeError: this.props.onClick is not a function

Вот мой код:

// PARENT 
var SendDocModal = React.createClass({ 
    getInitialState: function() { 
    return {tagList: []}; 
    }, 
    render: function() { 
    return (
     <div> 
     { 
      this.state.tagList.map(function(item) { 
      return (
       <TagItem nameProp={item.Name} idProp={item.Id} onClick={this.HandleRemove}/> 
      ) 
      }) 
     } 
     </div> 
    ) 
    }, 
    HandleRemove: function(c) { 
    console.log('On REMOVE = ', c); 
    } 
}); 

// CHILD 
var TagItem = React.createClass({ 
    render: function() { 
    return (
     <span className="react-tagsinput-tag"> 
     <span>{this.props.nameProp}</span> 
     <a className='react-tagsinput-remove' onClick={this.HandleRemove}></a> 
     </span> 
    ) 
    }, 
    HandleRemove: function() { 
    this.props.onClick(this); 
    } 
}); 

Заранее спасибо!

+0

Что именно не работает? –

+0

Упс! Извините. Я всегда получаю сообщение об ошибке: Uncaught TypeError: this.props.onClick не является функцией – user2787338

ответ

10

Вопрос заключается в том, что this внутри map обратного вызова не относится к React компонента, следовательно this.HandleRemove является undefined.

Вы можете установить значение this явно, передав второй аргумент map:

this.state.tagList.map(function() {...}, this); 

Теперь thisвнутри обратного вызова относится к тому же значению, как thisвне обратного вызова, а именно SendDocModal экземпляр ,

Это не имеет никакого отношения к Реагированию, это то, как работает JavaScript. См. How to access the correct `this` context inside a callback? для получения дополнительной информации и других рекомендаций.

+0

Привет, Феликс. Спасибо за ваш ответ. Пробовал без цикла (только компонент с жестко привязанными реквизитами), и он отлично работал. Но я не понимаю, как передать контекст в моем случае. Не могли бы вы описать это более подробно? – user2787338

+0

Извините, просто путайте forEach и карту. Это то же самое решение. Взгляните на ссылку в моем ответе, чтобы узнать больше об этом. –

+0

Если я понял право делать что-то вроде этого: \t 'код {this.state.tagList.map (функция (пункт) { \t \t \t \t \t \t \t \t возвращение ( \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t) \t \t \t \t \t \t \t}, это)} ', но в этом случае я получаю то же: неперехваченным TypeError: this.props.contextProp.props.onClick не является функцией – user2787338

1

Попробуйте следующее:

var SendDocModal = React.createClass({ 
     getInitialState: function() { 

      var item = {}; 
      item.Name = 'First'; 
      item.Id = 123; 

      var item2 = {}; 
      item2.Name = 'Second'; 
      item2.Id = 123456; 
      return {tagList: [item,item2]}; 
     }, 

     HandleRemove: function(c){ 
      console.log('On REMOVE = ', c); 
     }, 

     render: function() { 
      return (<div> 
       {this.state.tagList.map(function(item){ 
        return(
          <TagItem nameProp={item.Name} idProp={item.Id} key={item.Id} click={this.HandleRemove}/> 
        )}, this)} 
        </div> 
      )  
     } 

    }); 
    // CHILD 
    var TagItem = React.createClass({ 

     handleClick: function(nameProp) 
     { 
      this.props.click(nameProp); 
     }, 


     render: function(){ 
      return(
       <span className="react-tagsinput-tag" ><span onClick={this.handleClick.bind(this, this.props.nameProp)}>{this.props.nameProp}</span><a className='react-tagsinput-remove' ></a></span> 
      ) 
     } 
    }); 

Несколько изменений:

Добавлено 'это' после отображения tagList. Честно говоря, я не совсем понимаю, почему, может быть, может сказать нам более опытный программист.

Добавлен ключ для каждого элемента TagItem. Это рекомендуется, и консоль сообщит вам, что вы должны сделать это, чтобы при изменении состояния React мог отслеживать каждый элемент соответствующим образом.

Щелчок проходит через опоры. См. React js - having problems creating a todo list

+0

Да, так же, как посоветовал Феликс. немного более подробно. Большое спасибо, попытаюсь понять «эту» концепцию, выглядящую так отличной от Java ... – user2787338

+0

Нет проблем. Проверьте это: https://github.com/getify/You-Dont-Know-JS/blob/master/this%20&%20object%20prototypes/README.md#you-dont-know-js-this--object -prototypes – AndrewB

+0

Спасибо! обязательно прочитает! – user2787338

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