【问题标题】:JSX: render grid of imagesJSX:渲染图像网格
【发布时间】:2017-08-17 23:10:25
【问题描述】:

我有一个包含 8 个图像的列表,我想在一个网格中渲染:

----- ----- ----- ----- | | | | | | | | | | | | | | | | ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | | | | | | | | ----- ----- ----- -----

我用 Bootstrap 3 来做:行和列

<div className="row">

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>
</div> <!-- END row -->

<div className="row">

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

    <div className="col-xs-3">
        <img src="..." alt="..." />
    </div>

</div> <!-- END row -->

所以我需要遍历列表,并且对于每 4 个图像,我需要将它们包装成一行。这用作行之间的间隔 (20px)。

在普通 JS 中,我会在循环并使用迭代器索引作为条件时连接一串标记。但据我所知,我不能在 JSX 中做到这一点。

那么我如何使用 JSX 做到这一点?

【问题讨论】:

  • 我想我看到了这个问题。您需要将所有图像分组为 4 个数组,遍历组数组,并在组内遍历图像。
  • 如果其中一个答案解决了您的问题,请不要忘记投票/接受。

标签: css twitter-bootstrap reactjs twitter-bootstrap-3 react-jsx


【解决方案1】:

首先,您需要将图像按 4 分组。您可以使用下面的 groupBy 函数。它基本上将您的图像阵列分成 4 个组。 接下来,您需要遍历您的组以为每个组创建一行。 然后在组内,您需要遍历图像,每个图像列。

var images = ["https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/","https://baconmockup.com/300/200/"];
function render(){
  var imageGroups = groupBy(4, images);
  return (<div>
            {imageGroups.map(renderRow)}
          </div>);
}

function renderRow(group, index){
  return (<div className="row" key={index}>
            {group.map(renderColumn)}
          </div>);
}

function renderColumn(image, index){
  return (<div className="col-xs-3" key={index}>
            <img src={image} />
         </div>);
}

function groupBy(amountOfItemsPerGroup, items){
  var groups = [], 
    group, 
    total = items.length;
  for (var i=0; i < total; i += amountOfItemsPerGroup) {
    group = items.slice(i, i+amountOfItemsPerGroup);
    groups.push(group);
  }
  return groups;
}

ReactDOM.render(
  render(),
  document.getElementById('root')
);

jsbin

【讨论】:

  • 由于某些原因 jsbin 与 jsx 有问题,你可能需要刷新几次浏览器,或者用 js 运行几次。
  • 好建议,但我认为我不能使用它,因为我需要在添加和删除项目时为列表设置动画。我将“分组”列表包装在 ReactCSSTransitionGroup 组件中。但问题是我没有从分组列表中添加/删除,而是从处于状态的列表中添加/删除......所以反应没有注意到任何变化,因此没有任何动画......
  • 那太糟糕了,我希望你能找到一个过渡工作的解决方案。
  • 我会尽快研究 react-motion。这似乎是反应动画的好方法:)
【解决方案2】:

我认为,您不需要两排。 Bootstrap 将自动将第 5 个图像移动到下一行。相反,您应该清除修复类。

    let arr = [1,2,3,4,5,6,7,8];
     let rows= [];
         arr.forEach((val,index)=>{
        rows.push(<div key={index} className="col-xs-3">
            <img src="..." alt="..." />
        </div>
  })

    <div className="row">
    {
     rows
    }

 </div>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2014-07-26
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2020-10-12
相关资源
最近更新 更多