如何在 React Component 中有条件地包含列表元素

How to conditionally include list elements in React Component

我正在使用呈现字典列表的组件。我想有选择地传入一个将插入额外列表元素的道具。

...
render() {
    return (
        <dl>
          !! Optional !!
          <dt>{this.props.optionalPropObj.label}</dt>
          <dd>{this.props.optionalPropObj.value}</dd>
          !! Optional !!

          <dt>Label One</dt>
          <dd>{this.props.foo.one}</dd>

          <dt>Label Two</dt>
          <dd>{this.props.foo.two}</dd>

          <dt>Label Three</dt>
          <dd>{this.props.foo.Three}</dd>

          ...

        </dl>
    );
}

有几种方法可以做到这一点,但我想尽量减少此行为的逻辑足迹。主要问题是因为 React 需要一个包装元素,而 <dt><dd> 是子元素。

我可以分成两个 returns,这是非常低效的:

...
if (this.props.optionalPropObj) {
    return (
        <dl>
          // Include optional prop list element
        </dl>
    );
} else {
    return (
        <dl>
          // Exclude optional prop list element
        </dl>
    );
}

我可以用 css class 隐藏它们,但我有 4 个条件:

return (
    <dl>
      <dt className={this.props.optionalPropObj ? '' : 'hidden'}>
        {this.props.optionalPropObj && this.props.optionalPropObj.label}
      </dt>
      <dd className={this.props.optionalPropObj ? '' : 'hidden'}>
        {this.props.optionalPropObj && this.props.optionalPropObj.value}
      </dd>
    </dl>
);

如果我可以将元素包装在 div 中,这种情况就很简单了。

return (
    ...
    {includeOptional && <OptionalThing />}
    or
    {includeOptional ? <OptionalThing /> : null}
    ...
);

理想情况下,我想要一种方法来检查一次可选属性并包含额外元素而无需任何代码重复。

你可以试试这个

render() {
    return (
        <dl>
          { 
           this.props.optionalPropObj &&
            <span>
              <dt>{this.props.optionalPropObj.label}</dt>
              <dd>{this.props.optionalPropObj.value}</dd>
            </span>
          }

          <dt>Label One</dt>
          <dd>{this.props.foo.one}</dd>

          <dt>Label Two</dt>
          <dd>{this.props.foo.two}</dd>

          <dt>Label Three</dt>
          <dd>{this.props.foo.Three}</dd>

          ...

        </dl>
    );
}

我找到了一种使用有效 Html 输出的方法。您有条件地包含一个元素数组。由于 <dl> 标签的唯一有效子元素是 <dt><dd>,我需要一种方法来添加没有包装器的片段。

render() {
    return (
       <dl>
         { 
            this.props.optionalPropObj &&
            [
               <dt key="optionalPropLabel">{this.props.optionalPropObj.label}</dt>,
               <dd key="optionalPropValue">{this.props.optionalPropObj.value}</dd>
            ]
         }

         <dt>Label One</dt>
         <dd>{this.props.foo.one}</dd>

         <dt>Label Two</dt>
         <dd>{this.props.foo.two}</dd>

         <dt>Label Three</dt>
         <dd>{this.props.foo.Three}</dd>

         ...

       </dl>
    );
}

编辑:因为我正在渲染一个数组,React 需要每个元素的键,所以我添加了一些虚拟键。我一次只在一个页面上显示其中一个,所以我的要求允许它们是静态的。