【发布时间】:2015-03-01 07:10:14
【问题描述】:
我在为 React 中的单选按钮组件设置默认选项时遇到了令人惊讶的困难。
这是我的RadioToggle 组件:
/** @jsx React.DOM */
var RadioToggle = React.createClass({
render: function () {
var self = this;
return (
<div className="RadioToggle">
{this.props.radioset.radios.map(function(radio, i){
return (
<label className="__option" key={i}>
<h3 className="__header">{radio.label}</h3>
{radio.checked ?
<input className="__input"
type="radio"
name={self.props.radioset.name}
value={radio.value}
defaultChecked />
: <input className="__input"
type="radio"
name={self.props.radioset.name}
value={radio.value} />
}
<span className="__label"></span>
</label>
)
})
}
</div>
);
}
});
module.exports = RadioToggle;
这是我创建组件的方式:
<RadioToggle radioset={
{
name: "permission_level",
radios: [
{
label: "Parent",
value: 1,
checked: false
},
{
label: "Child",
value: 0,
checked: true
}
]}
}/>
上述代码有效,但我们不喜欢根据radio.checked 选项生成几乎相同的代码。
组件的设置方式,我向它传递一个名称和一个要创建的收音机数组,并为收音机数组中的每个对象使用该数据来创建一个单选按钮。
在其他情况下,我可以通过将三元语句作为值来有条件地设置属性,如下所示,但这在这里不起作用。
defaultChecked={radio.checked ? "checked" : ""} 的问题在于,即使一个单选按钮上的输出变为 checked="checked" 和另一个单选按钮上的 checked,它也会默认选中两个单选按钮,导致最后一个 实际上 正在检查中。
再一次,上面的组件可以工作,但我希望对 React 有更多经验的人能有一种更简洁的方式来做这件事,而不是生成除了那个属性之外几乎相同的元素。
【问题讨论】:
-
您可以将上下文作为第二个参数传递给
map,而不是使用var self = this。this.props.radioset.radios.map(..., this);.
标签: javascript radio-button reactjs