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

时间:2016-10-11 16:56:12

标签: javascript html css reactjs jsx

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

...
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>是子元素。

我可以分成两个回报,效率非常低:

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

我可以用css类隐藏它们,但后来我有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}
    ...
);

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

2 个答案:

答案 0 :(得分:0)

你可以试试这个

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>
    );
}

答案 1 :(得分:0)

我找到了一种方法来使用有效的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想要每个元素的键,所以我添加了一些虚拟键。我一次只在一个页面上显示其中一个,所以我的要求允许它们是静态的。