我在尝试使用 React 创建一个用于选择和取消选择其他单个复选框(全选/取消全选)的复选框时遇到了一个小问题。 .我读过 http://facebook.github.io/react/docs/forms.html并发现controlled和not controlled之间存在差异<input>
秒。我的测试代码如下:
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" data-id={d.id} checked={d.selected} onChange={this.__changeSelection} />
{d.id}
<br />
</div>
);
});
return (
<form>
<input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks} />Global selector
<br />
{checks}
</form>
);
},
__changeSelection: function(e) {
var id = e.target.getAttribute('data-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(e) {
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'));
“全局选择器”按预期工作:选中时,将选中所有其他检查。问题是 __changeSelection()
单击其他复选框之一时不会触发处理程序。
我不知道完成这项工作的正确方法是什么。也许 React 模型不是模拟这种交互的最佳模型?我能做什么?
提前致谢
最佳答案
在您的render
函数中,checks
映射函数的this
的作用域不同于render
,这是 __changeSelection
所需的范围,因此 this.__changeSelection
不会找到 __changeSelection
属性。如果将 .bind(this)
添加到该映射函数的末尾,则可以将其范围绑定(bind)到与 render
相同的 this
:
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 });
}
这是所有内容的示例,along with a jsfiddle for you to try it out :
/** @jsx React.DOM */
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'));
关于javascript - react ( Facebook ): managed state of controlled checkboxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581688/