2015-04-07 123 views
0

任何人都可以告诉我为什么handleChange没有触发,当我点击任何复选框?复选框按照我想要的预期值呈现,但不会触发点击处理程序。只要你不设置明确它被设置为undefined反应:输入类型=“复选框”onChange没有触发

37 var AutocompleteFromCheckboxes = React.createClass({ 
38  handleChange: function(e) { 
39  console.log('hi'); 
40  return 1; 
41  }, 
42  render: function() { 
43  var autocompleteFrom = this.props.autocomplete_from.map(function(value) { 
44   return (
45   <label for={value}> 
46    <input type="checkbox" name={value} value="{value}" 
47    onChange={this.handleChange} 
48    ref="autocomplete-from"/> 
49    {value} 
50   </label> 
51  ); 
52  }); 
53  return (
54   <div className="autocomplete-from"> 
55   {autocompleteFrom} 
56   </div> 
57  ); 
58  } 
59 }); 
+0

请注意,为了在HTML中获得'for'属性,您需要在JSX中使用'htmlFor'。 – chirlu

回答

1

在你的代码中匿名函数与错误的上下文中运行。

这意味着thisundefined因此this.handleChange应该抛出一个异常(不知道为什么你没有检查该控制台如果你有 - 你为什么没有提到它)。

为了解决这个问题,你可以明确地通过上下文作为Array.prototype.map函数调用的第二个参数:尽快

var autocompleteFrom = this.props.autocomplete_from.map(function(value) { 
    // ... 
}, this); 

而当你解决这个特定的问题,并准备潜入细节上如何this在JS中工作,请按照这个amazing answer

+1

除了@zerkms的答案,这是使用严格模式的一个很好的理由 - 如果你有''使用严格';'在包含这个组件的模块的顶部,你会得到一个'这是未定义的'指向'this.handleChange'行的错误。 –

+0

或者是使用带有箭头功能的ES6的一个很好的理由,并且再也不用担心'this'再次作用\ *将es5关闭手\ *。实际上,它只是jstransform上的一个编译器标志(jsx/reactify/jsx-loader),请继续并翻转它。 – FakeRainBrigand

+0

如果没有''use strict';','this'将会是'window',而不是未定义的。 –