在地图中跳过jsx的div包装

时间:2017-05-12 08:05:28

标签: javascript reactjs ecmascript-6

我有一个使用此组件显示UI的数组对象。我有一个问题,我的风格因为额外的而破了。

<ul className="dropdown-menu">
    {map(listItems, (obj,i) => 
        <li key={i} onClick={e => dropdownHandler(obj.handlerName)}>
          {obj.visible && <div>
                  <a>
                    {obj.iconClasses && 
                        <i className={obj.iconClasses}></i>
                    }
                    {obj.name}
                  </a>
                  <div key={i} className={classnames({'divider':obj.divider})}></div>
              </div>
          }
        </li>
    )}
</ul>

{obj.visible ..的行中我还能做些什么?我不想包含div

3 个答案:

答案 0 :(得分:0)

要将条件置于JSX内,我们可以使用ternary operator,如下所示:

{1==1 ? <div> hello </div> : null}

如果您不想在条件失败时渲染任何内容,请返回null

使用此:

<li key={i} onClick={e => dropdownHandler(obj.handlerName)}>
      {obj.visible ? 
           <a>
              {obj.iconClasses && 
                   <i className={obj.iconClasses}></i>
              }
              {obj.name}
           </a>
       : null}
       {obj.visible ? 
           <div key={i} className={classnames({'divider':obj.divider})}></div>
       : null}
</li>

答案 1 :(得分:0)

您可以简单地使用两个条件并省略包装元素:

<li key={i} onClick={e => dropdownHandler(obj.handlerName)}>
  {obj.visible &&
    <a>
      {obj.iconClasses && 
        <i className={obj.iconClasses}></i>
      }
      {obj.name}
    </a>
  }
  {obj.visible &&
    <div key={i} className={classnames({'divider':obj.divider})}></div>
  }
</li>

此外,使用数组索引作为键是反模式。您应该使用一些业务键。有关此answer的更多信息。

答案 2 :(得分:0)

React的一个缺点是你需要将每个块包装在一个容器中。它们是working on the solution,但可能需要一段时间。与此同时,在您的情况下跳过额外<div的最简单方法是分别检查其下的两个元素:

{obj.visible &&
  <a>
    {obj.iconClasses && 
      <i className={obj.iconClasses}></i>
    }
    {obj.name}
  </a>
{obj.visible && <div key={i} className={classnames({'divider':obj.divider})}></div>}