在你的
render功能,范围
this为
checks映射功能是不同的
render,这是你需要的范围
__changeSelection,所以
this.__changeSelection不会找到一个
__changeSelection属性。如果
.bind(this)在该映射函数的末尾添加a
,则可以将其作用域绑定
this为
render:
var checks = this.state.data.map(function(d) { return ( <div> <input type="checkbox" data-id={d.id} checked={d.selected} onChange={this.__changeSelection} /> {d.id} <br /> </div> );}.bind(this));附带说明一下,我只是将传递
id给处理函数,而不是分配数据属性。这将消除在处理程序中定位该元素的需要:
var checks = this.state.data.map(function(d) { return ( <div> <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} /> {d.id} <br /> </div> );}.bind(this));然后更新您的
__changeSelection函数以
id第一个arg形式传入,并删除属性查找行:
__changeSelection: function(id) { var state = this.state.data.map(function(d) { return { id: d.id, selected: (d.id === id ? !d.selected : d.selected) }; }); this.setState({ data: state });}这是所有示例放在一起的示例,以及一个jsfiddle可供您试用:
var Test = React.createClass({ getInitialState: function() { return { data: [ { id: 1, selected: false }, { id: 2, selected: false }, { id: 3, selected: false }, { id: 4, selected: false } ] }; }, render: function() { var checks = this.state.data.map(function(d) { return ( <div> <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} /> {d.id} <br /> </div> ); }.bind(this)); return ( <form> <input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks} />Global selector <br /> {checks} </form> ); }, __changeSelection: function(id) { var state = this.state.data.map(function(d) { return { id: d.id, selected: (d.id === id ? !d.selected : d.selected) }; }); this.setState({ data: state }); }, __changeAllChecks: function() { var value = this.refs.globalSelector.getDOMNode().checked; var state = this.state.data.map(function(d) { return { id: d.id, selected: value }; }); this.setState({ data: state }); }});React.renderComponent(<Test />, document.getElementById('content'));


