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

Posted

技术标签:

【中文标题】在 React.js 中有条件地设置 html 属性【英文标题】:Conditionally setting html attributes in React.js 【发布时间】: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 = thisthis.props.radioset.radios.map(..., this);. 【参考方案1】:

checked/defaultChecked 采用布尔值,而不是字符串。

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

jsbin demo

旁注:避免使用 defaultChecked/defaultValue 并使用 check/value 和 onChange。

【讨论】:

您的 bin 为我抛出了一个错误,但我确实将选中的 prop 设置为布尔值(编辑:nvm 我看到了您引用的示例)。 checked 本身在 html 中没有任何值,甚至 checked=false 仍然将元素标记为默认值,所以我在假设它在 React 中是相同的情况下进行操作。我可以发誓我尝试了你的建议,但你是对的,React 中的defaultChecked=false 不会输出单独的checked 属性或checked=false,所以这可以正常工作。你介意详细说明你的旁注吗?您将如何使用 onChange 来标记默认值? 您将数据保持在已检查状态,并在用户更改它时更新它,这会导致 UI 更新,并且一切都按预期工作。但是,您可以根据该状态另外渲染其他内容,例如选择某个值时的额外表单字段,或者您可以将数据发送到其他地方,例如在单击按钮时向服务器发出 ajax 发布请求。 为什么要避免 defaultChecked/defaultValue? 不太清楚,你经常要么直接修改dom,要么重写它以使用value/onChange。它还让&lt;input&gt;&lt;MyCustomInput&gt; 组件之间没有区别,API 明智。最好从一开始就一直这样做。 此页面描述了 React 方法:facebook.github.io/react/docs/forms.html

以上是关于在 React.js 中有条件地设置 html 属性的主要内容,如果未能解决你的问题,请参考以下文章

react-router-dom 链接在 app.js(父组件)中有效,但在子组件中无效

如何在Vue中有条件地设置选定的选项

在 Handsontable 中有条件地设置嵌套行的样式

在 Facelets 中有条件地呈现纯 HTML 属性

如何在 Visual Studio 代码中配置设置,以便更漂亮地为 react.js 工作

在 Vue.js 中有条件地定位具有 CSS 样式的类