14

我只想做以下事情:

<div class="container">
  <div class="row">
    <div class="col-md-4">content</div>
    <div class="col-md-4">content</div>
    <div class="col-md-4">content</div>
  </div>
  <div class="row">
    <div class="col-md-4">content</div>
    <div class="col-md-4">content</div>
    <div class="col-md-4">content</div>
  </div>

   <!-- etc ... -->

</div>

例如,每 3 个.col-md-4's包裹在一个.row

我试过了:

rows.push(<div className="row">);

   for (var count = 0; count < 9; count++) { 

       rows.push( <!-- content --> );

       // Add closing and reopening divs every 3 elements
       if (count % 3 === 0) {
          rows.push(</div><div className="row">);
       }
   }

   rows.push(</div>);
}

不幸的是,这不起作用。

此外,3 和 9 只是这里的示例,我想知道是否有通用方法。

4

3 回答 3

21

您不应该像字符串那样连接元素,而是创建和组合反应元素。您可以先生成包含内容的元素数组,然后将其减少为组并用容器包装:

render() {
    var content = [
        "content 1", "content 2", "content 3", "content 4", "content 5",
        "content 6", "content 7", "content 8", "content 9", "content 10"
    ];
    var groupSize = 3;
    var rows = content.map(function(content) {
        // map content to html elements
        return <div className="col-md-4">{content}</div>;
    }).reduce(function(r, element, index) {
        // create element groups with size 3, result looks like:
        // [[elem1, elem2, elem3], [elem4, elem5, elem6], ...]
        index % groupSize === 0 && r.push([]);
        r[r.length - 1].push(element);
        return r;
    }, []).map(function(rowContent) {
        // surround every group with 'row'
        return <div className="row">{rowContent}</div>;
    });
    return <div className="container">{rows}</div>;
}
于 2015-12-24T22:33:25.350 回答
5

如果您已经在使用lodash,您可能对chunk函数感兴趣:

render: function() {
  var rows = [<div className="col-md-4">content</div>, ...]

  return _.chunk(rows, 3).map(function(group) { 
      return <div className="row">{group}</div>
    });
}
于 2015-12-25T00:37:50.860 回答
0

您不能只将开始/结束标签放在数组中,将列收集在数组中并使用有效的开始和结束标签将它们全部输出:

rows.push(<div className="row">{columns}</div>);
于 2015-12-24T22:12:50.450 回答