在 React.js 中有条件地设置 html 属性

Conditionally setting html attributes in React.js

本文关键字:设置 html 属性 有条件 React js      更新时间:2023-09-26

我在 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 有更多经验的人能有一种更简洁的方法,而不是生成除了该属性之外几乎相同的元素。

选中/默认检查取布尔值,而不是字符串。

<input className="__input"
     type="radio"
     name={self.props.radioset.name}
     value={radio.value}
     defaultChecked={radio.checked} />

JSBIN演示

旁注:避免默认检查/默认值,而将选中/值与onChange一起使用。