【问题标题】:How to create dynamic Row using loop in JSX?如何在 JSX 中使用循环创建动态行?
【发布时间】:2021-03-31 10:08:18
【问题描述】:

我正在使用react-bootstrap,我想复制这个结构:

<div class="row">
    <div class="col-lg-3"></div>
    <div class="col-lg-3"></div>
    <div class="col-lg-6"></div>
</div>
<div class="row">
    <div class="col-lg-6"></div>
    <div class="col-lg-3"></div>
    <div class="col-lg-3"></div>
</div>

我有一个必须在上面的列中显示的文章列表,如果您仔细观察,您会发现每一行都以不同的列开头,第一列以 3 开头,第二列以 6 开头,依此类推...

所以我写了:

<Container>
    {articles.map((art, i) =>
    (i + 1) % 3 === 0 ? (
        <Row>
        {" "}
        <></>
        <BlogItem index={i} colNum={3} art={art} />{" "}
        </Row>
    ) : (
        <></>
    )
    )}
</Container>

但这会产生不同的结构:

我做错了什么?

博客项目

const BlogItem = ({ index, colNum, art }) => {
  const intl = useIntl()

  return (
    <div
      className={(index + 1) % colNum === 0 ? "col-lg-6" : "col-lg-3"}
      key={index}
    >
      <Link to={`/blog/${art.slug}`}>
        <Card className="card-background">
          <div
            className="full-background"
            style={{
              backgroundImage: `url(${process.env.API_URL}${art.featured_image.url})`,
            }}
          ></div>
          <Card.Body>
            <div className="content-bottom">
              <div className="card-category">
                {Localization(art.category.name, intl.locale)}
              </div>
              <Card.Title>{Localization(art.name, intl.locale)}</Card.Title>
            </div>
          </Card.Body>
        </Card>
      </Link>
    </div>
  )
}

【问题讨论】:

  • 没有更多的代码是不可能知道的。 BlogItem 中有什么?文章是什么样的?
  • @DavidFrederick 检查更新。 BlogItem 只是显示文章结构..

标签: reactjs jsx react-bootstrap


【解决方案1】:

您需要为您的 BlogItems 做另一个循环。对于每一行,您需要 3 个 BlogItem。外部映射负责行,内部映射负责 BlogItems。

要获取列宽的交替类名,您可以传递一个新的道具,告诉 BlogItem 它所在的行是否在偶数位置。

<Container>
    {articles.map((art, i) =>
    (i + 1) % 3 === 0 ? (
        <Row>
        {" "}
        <></>
        {Array(3).fill().map((el, index) => {
           return <BlogItem index={index} even={i % 2 === 0} colNum={3} art={art} />
        })}
        {" "}
        </Row>
    ) : (
        <></>
    )
    )}
</Container>
const BlogItem = ({ index, colNum, art, even }) => {
  const intl = useIntl();
  let wrapperClass;
  if (even && index === 0 || !even && index === 2) {
    wrapperClass = "col-lg-6";
  } else {
    wrapperClass = "col-lg-3";
  }

  return (
    <div
      className={wrapperClass}
      key={index}
    >
      <Link to={`/blog/${art.slug}`}>
        <Card className="card-background">
          <div
            className="full-background"
            style={{
              backgroundImage: `url(${process.env.API_URL}${art.featured_image.url})`,
            }}
          ></div>
          <Card.Body>
            <div className="content-bottom">
              <div className="card-category">
                {Localization(art.category.name, intl.locale)}
              </div>
              <Card.Title>{Localization(art.name, intl.locale)}</Card.Title>
            </div>
          </Card.Body>
        </Card>
      </Link>
    </div>
  )
}

【讨论】:

  • 感谢您,但是如何为每个创建的行显示不同的起始列?例如:col-lg-3 秒,col-lg-6
  • 不确定我是否完全理解。您的意思是更改每行中第一项的列宽吗?例如。 className="col-lg-{dynamicValue}" ?
  • 我的意思是{dynamicValue}。检查我在问题中的示例,您的代码始终为 col-lg-3,但每个新行应在 col-lg-3 和 col-lg-6 之间交替
  • 我更新了我认为你想要的答案。
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 2021-05-06
  • 2020-09-22
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多