如何有条件地向React组件添加属性?

JavaScript

达蒙西门

2020-03-09

如果满足特定条件,是否有办法仅将属性添加到R​​eact组件?

我应该在渲染后基于Ajax调用将required和readOnly属性添加到表单元素中,但是由于readOnly =“ false”与完全省略该属性不同,因此我看不到如何解决此问题。

下面的示例应解释我想要的内容,但它不起作用(解析错误:意外的标识符)。

var React = require('React');

var MyOwnInput = React.createClass({
    render: function () {
        return (
            <div>
                <input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
            </div>
        );
    }
});

module.exports = React.createClass({
    getInitialState: function () {
        return {
            isRequired: false
        }
    },
    componentDidMount: function () {
        this.setState({
            isRequired: true
        });
    },
    render: function () {
        var isRequired = this.state.isRequired;

        return (
            <MyOwnInput name="test" {isRequired ? "required" : ""} />
        );
    }
});

第351篇《如何有条件地向React组件添加属性?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

5个回答
阿飞神乐 2020.03.09

在React中,您可以有条件地渲染Components,也可以有条件地渲染其属性,例如props,className,id等。

在React中,最好使用三元运算符,它可以帮助您有条件地渲染Components。

一个示例还显示了如何有条件地渲染Component及其样式属性。

这是一个简单的示例:

class App extends React.Component {
  state = {
    isTrue: true
  };

  render() {
    return (
      <div>
        {this.state.isTrue ? (
          <button style={{ color: this.state.isTrue ? "red" : "blue" }}>
            I am rendered if TRUE
          </button>
        ) : (
          <button>I am rendered if FALSE</button>
        )}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>

ItachiGreen 2020.03.09

如果使用ECMAScript 6,则可以这样编写。

// First, create a wrap object.
const wrap = {
    [variableName]: true
}
// Then, use it
<SomeComponent {...{wrap}} />
Davaid神无 2020.03.09

您可以使用相同的快捷方式,该快捷方式用于添加/删除组件(的一部分{isVisible && <SomeComponent />})。

class MyComponent extends React.Component {
  render() {
    return (
      <div someAttribute={someCondition && someValue} />
    );
  }
}
Gil米亚卡卡西 2020.03.09

这是我做到的方式。

有条件的

<Label
    {...{
      text: label,
      type,
      ...(tooltip && { tooltip }),
      isRequired: required
    }}
/>

我仍然更喜欢使用常规的方式传递道具,因为(在我看来)在没有任何条件的情况下它更具可读性。

没有条件

<Label text={label} type={type} tooltip={tooltip} isRequired={required} />
小哥梅 2020.03.09

显然,对于某些属性,如果您传递给它的值不真实,React足够聪明,可以忽略该属性。例如:

var InputComponent = React.createClass({
    render: function() {
        var required = true;
        var disabled = false;

        return (
            <input type="text" disabled={disabled} required={required} />
        );
    }
});

将导致:

<input type="text" required>

更新:如果有人对如何/为什么发生这种情况感到好奇,可以在ReactDOM的源代码中找到详细信息,特别是在DOMProperty.js文件的30167

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android