循环中的JSX条件元素

时间:2019-05-16 14:36:13

标签: javascript reactjs jsx

如何在条件上定义标签的打开和在另一个条件上的标签的关闭。 在下面的示例中,我尝试将每两个元素包装在新行上。但是似乎不起作用。样本-https://jsfiddle.net/reactjs/69z2wepo/

render() {
    let menuItems = [];
    for (var i = 0; i < 10; i++) {
        menuItems.push(
        {i%2 !== 0 ? <div class="row">:<>}
        <div>hi</div>
        {i%2 === 0 ? </div>:<>}
        );
    }
    return <div>{menuItems}</div>;
  }

4 个答案:

答案 0 :(得分:1)

在渲染之前构建数据对象;这允许React以声明性的方式呈现,并且足够灵活以呈现您想要添加的尽可能多的行或列。

此外,我还故意创建了rows数组;没有理由没有循环中使用的numRows变量来追加到rows数组。

https://codesandbox.io/s/clever-moser-3j51c

组件

function App() {
  const cell = "hi";
  const rows = [
    [cell, cell],
    [cell, cell],
    [cell, cell],
    [cell, cell],
    [cell, cell]
  ];

  return rows.map((row, i) => {
    return (
      <div key={i} className="row">
        {row.map((data, j) => (
          <span key={j}>{data}</span>
        ))}
      </div>
    );
  });
}

输出

hi hi
hi hi
hi hi
hi hi
hi hi

由于您未提供CSS,因此我将内部<div>元素替换为<span>,因此您可以自行设置适当的样式。

答案 1 :(得分:1)

您需要还原逻辑。您试图总是插入一个<div>,但是您需要做的是将其保存在<div>数组中,并仅在所需的时间推送它。

render() {
    let menuItems = [];
    let hiDivs = []
    for (var i = 0; i < 10; i++) {
        hiDivs.push(<div>hi</div>)
        if(hiDivs.length === 2){
            menuItems.push(<div class="row">{hiDivs}</div>)
            hiDivs = []
        }
    }
    return <div>{menuItems}</div>;
}

您可以使用dangerouslySetInnerHTML,但这非常糟糕,不建议使用...

答案 2 :(得分:0)

这种方式怎么样?

  render() {
      let menuItems = [];
      for (var i = 0; i < 10; i++) {
          const hi = <div>hi</div>
          const item = i%2 === 0
              ? <div className="row">{hi}{hi}</div>
              : hi;
          menuItems.push(item);
      }
      return <div>{menuItems}</div>;
  }

您可能还想添加一个'key'属性,因为react会针对元素数组抛出警告。

答案 3 :(得分:-2)

如果您想要的输出只是下面的内容,没有其他限制(即始终为两个高 在每行里面)

<div className="row">
   <div>hi</div>
   <div>hi</div>
</div> 
<div className="row">
   <div>hi</div>
   <div>hi</div>
</div>
..........

您可以这样做:

let menuItems = []
for(let i = 0 ; i < 5; i++){
  menuItems.push(<div className="row"><div>hi</div><div>hi<div></div>)
}