React:内联有条件地将prop传递给组件

Mat*_*bst 59 javascript inline reactjs

我想知道是否有一种更好的方式来有条件地传递道具而不是使用if语句.

例如,我现在有:

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    if(this.props.editable) {
      return (
        <Child editable={this.props.editableOpts} />
      );
    } else {
      // In this case, Child will use the editableOpts from its own getDefaultProps()
      return (
        <Child />
      );
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有if语句的情况下编写这个?我正在考虑JSX中的一种inline-if语句:

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    return (
      <Child 
        {this.props.editable ? editable={this.props.editableOpts} : null} 
      />
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

总结:我正试图找到一种方法来定义一个道具Child,但是传递一个值(或做一些其他的),这样Child仍然可以从Child自己的价值中提取道具的价值getDefaultProps().

Jim*_*itt 104

你很接近你的想法.事实证明,传递undefined支柱与完全不包括它一样,这仍将触发默认支柱值.所以你可以这样做:

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    return <Child 
      editable={this.props.editable ?
                  this.props.editableOpts : 
                  undefined}
    />;
  }
});
Run Code Online (Sandbox Code Playgroud)

  • "null"没有"未定义"这样的力量,BTW. (5认同)
  • 有用的技巧!希望有关于如何有效使用条件渲染技术的好资源 (3认同)
  • 我知道这个答案已经很旧了,所以我不知道在此期间事情是否发生了变化,但对于 2021 年偶然发现这个答案的人来说:将 `undefined` 作为 prop 传递与不设置根本没有支撑。在组件内,检查“Object.keys(props)”将显示已设置的属性 - 甚至是“未定义”的值。这对于某些组件来说很重要,这些组件根据设置的 props 既可以充当受控组件,也可以充当非受控组件。 (3认同)

Leo*_*dov 9

定义props变量:

let props = {};
if (this.props.editable){
  props.editable = this.props.editable;
}
Run Code Online (Sandbox Code Playgroud)

然后在JSX中使用它:

<Child {...props} />
Run Code Online (Sandbox Code Playgroud)

以下是代码中的解决方案:

var parent = React.createClass({
  propTypes: {
    editable: React.PropTypes.bool.isRequired,
    editableOpts: React.PropTypes.shape({...})
  },
  render: function() {
    let props = {};
    if (this.props.editable){
      props.editable = this.props.editable;
    }
    return (
      <Child {...props} />
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

来源,反应文档:https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes

  • 我喜欢这个解决方案。我会使用“childProps”来避免混淆 (2认同)

Jun*_*wan 9

这可能对你有帮助。我经常使用这个方法

    <Component
      otherProps
      {...(yourCondition ? { 
        deleteIcon: <DeleteIcon id={`${id}_icon`} />,
       }
      : {})}
    />
Run Code Online (Sandbox Code Playgroud)

另一种方法

<Component 
  {...(yourCondition && 
  { prop: propValue })}
/>

Run Code Online (Sandbox Code Playgroud)


Jam*_*ain 7

将价差运算符添加到this.props.editable

<Child {...(this.props.editable ? {editable: {this.props.editableOpts}} : undefined)} >
Run Code Online (Sandbox Code Playgroud)

应该可以。

  • @garyee:区别在于,某些组件可能会错误地将“undefined”视为覆盖(例如“null”,它始终是覆盖),因此保留默认值而不是将其设置为虚假值的唯一方法是显式不传递它,不传递`undefined`。 (3认同)
  • @sktguha:确实是的,我认为看起来像一个错字:我们不能传播未定义的内容,所以是的,最后应该是一个“{}”。我会推荐一个版本,谢谢:) (2认同)
  • 表达式可以简化为 `&lt;Child {...(this.props.editable &amp;&amp; { editable: this.props.editableOpts })} /&gt;` (2认同)
  • 这对于 2022 年来说似乎是一个更好的答案 (2认同)

Ame*_*icA 5

实际上,如果您的道具是布尔值,则不需要实现条件,但如果您想通过内联条件添加道具,您应该像下面这样写:

const { editable, editableOpts } = this.props;
return (
  <Child {...(editable && { editable: editableOpts } )} />
);
Run Code Online (Sandbox Code Playgroud)

希望它不会让你感到困惑。的{...手段是传播经营者喜欢通过存在的道具:{...props}editable &&手段,如果editabletrue{ editable: editableOpts }对象将与{...我们将一个新的对象喜欢它:{...{ editable: editableOpts }}它意味着editable={editableOpts},但如果this.porps.editable是真实的。


mor*_*aei 5

你也可以尝试这种快捷方式

 <Child {...(this.props.editable  && { editable: this.props.editableOpts })} />
Run Code Online (Sandbox Code Playgroud)