2015-02-06 43 views
3

我需要根据复选框中的事件显示一些HTML。 当放置在forEach循环中时,父节点上的onClick事件不会传递函数(here's my fiddle)。关于它的奇怪之处是,当我将它传递给单个元素时它会传递一个函数。onClick事件在放置在ReactJS中的forEach循环时未传递函数

var App = React.createClass({ 
 
    getInitialState: function() { 
 
    return {toggle: false} 
 
    }, 
 
    handleClick : function(event){ 
 
    this.setState({toggle : !this.state.toggle}); 
 
    }, 
 
    render: function(){ 
 
    var checkboxes = []; 
 
    this.props.data.forEach(
 
     function(name) 
 
     { 
 
     checkboxes.push(<CheckBox onClick={this.handleClick} name={name} />); 
 
         }); 
 
     var textBox = this.state.toggle ? <InputBox name="Bar" /> : null; 
 
     return (
 
      <div> 
 
      <CheckBox name="Foo" onClick={this.handleClick} /> 
 
      {checkboxes} 
 
      {textBox} 
 
      </div> 
 
     ); 
 
     } 
 
});

有谁知道为什么发生这种情况?这是一个错误还是我做错了什么?

回答

6

thisthis.handleClickno longer refers to the React component object,因为它在传递给forEach的匿名函数中。一般来说,你可以bind函数的this到它的上下文中,类似这样的

this.props.data.forEach(
    function(name) { ... }.bind(this)); 

用foreach,你也可以将它作为第二个参数。

this.props.data.forEach(
    function(name) { ... }, this); 
+0

'this'实际上是未定义的,或者是forEach回调中非严格模式下的全局对象。 – FakeRainBrigand 2015-02-06 22:57:32

+0

'forEach'将可选的第二个参数作为'this'上下文,不需要调用'bind':'this.props.data.forEach(function(){...},this);' – 2015-02-07 06:49:12

+0

糟糕,我猜我还有更多要了解'this'。编辑我的原始答案。我留下了绑定示例,因为在类似的情况下,通过'this'作为参数不是一种选择可能会有用。 – 2015-02-07 08:31:43