【问题标题】:How to make a loop of components in render method?如何在渲染方法中制作组件循环?
【发布时间】:2019-11-17 11:48:48
【问题描述】:

我有一个分页组件,它从其父级接收作为道具,它必须呈现的页面链接数。

假设一家公司有 90 名员工。在这种情况下,Pagination 组件将使用数字 9 作为道具(每个页面呈现 10 个工作人员,产生 9 个页面,每个页面有 10 个工作人员)。

如何创建一个循环来获取道具并根据道具带来的内容循环 DIV 和链接?

如果我创建一个 FOR 循环,它会在我的页面中打印“[object]”而不是 HTML。

import React, { Component } from 'react'

class Paginacao extends Component {
    render() {

    // This console.log() returns 9
    console.log(this.props.totalPages);

        return (
            <div>
                // A 9-cycles loop must print this:
                // <div><a href = "page1">1</a></div>
                // <div><a href = "page2">2</a></div>
                // <div><a href = "page3">3</a></div>
                // <div><a href = "page4">4</a></div>
                // <div><a href = "page5">5</a></div>
                // <div><a href = "page6">6</a></div>
                // <div><a href = "page7">7</a></div>
                // <div><a href = "page8">8</a></div>
                // <div><a href = "page9">9</a></div>
            </div>
        )
    }
}

export default Paginacao

【问题讨论】:

    标签: javascript html reactjs jsx


    【解决方案1】:

    你可以像这样使用 for 循环。

    import React, { Component } from 'react'
    
    class Paginacao extends Component {
        render() {
          const items = [];
    
          for (let i = 0; i < this.props.totalPages; i++) {
            items.push(<div><a href =`page${i + 1}`>{i + 1}</a></div>)
          }
         // This console.log() returns 9
        console.log(this.props.totalPages);
    
            return (
                <div>
                   {items}
                </div>
            )
        }
    }
    
    export default Paginacao
    

    【讨论】:

    • 这是一个非常优雅和出色的解决方案
    • 对不起,我迟到了。你的答案就是解决方案。谢谢!我使用了和你一样的结构。但我确实喜欢这样:let html = "";在 FOR 循环中我做了: html += 所以,不同的是我没有使用“push”但是字符串中的“+=”。你能解释一下为什么当我使用字符串时 React 返回 [object] 吗?谢谢!
    【解决方案2】:

    您需要从this.props.totalPages 编号创建数组。最简单的方法是

    const pages = [];
    
    for (let i = 1; i <= this.props.totalPages; i++) {
      pages.push(<div><a href={`page{i}`}>{i}</a></div>);
    }
    

    然后在渲染方法中

    return (
      <div>
        {pages}
      </div>
    )
    

    或更花哨的风格:

    return (
      <div>
        {Array.from(Array(this.props.totalPages).keys()).map(i =>
          <div><a href={`page{i + 1}`}>{i + 1}</a></div>
        )}
      </div>
    )
    

    如果你使用 Ramda 或类似的 lib,你可以将 Array.from(Array(this.props.totalPages).keys()) 替换为 R.times

    【讨论】:

    • 这就是解决方案。我实际上测试了 Chaim Friedman 的解决方案,就像你的一样。我试图将“pages”作为字符串返回,而 HTML 中的打印是 [object]。你知道为什么吗?
    【解决方案3】:

    映射一个传递对象数组并将该数组映射到您要渲染的组件。

    如下代码:

    <div>
      {
        [1, 2, 3, 4, 5, 6, 7, 8, 9].map(item => {
          return <div><a href={'page' + item + 1}>{item}</a></div>;
        })
      }
    </div>
    

    【讨论】:

    • 感谢您分享您的解决方案 Ravi Sevta!我将返回值用作字符串而不是数组,它在我的页面中返回 [object]。你能解释一下为什么会这样吗?
    • @Raphael Alvarenga,您能否分享您当前的循环代码,以便我检查一下。
    • 对不起...我已经根据此处建议的解决方案更改了代码。基本上,我用 HTML 作为字符串填充了一个变量。喜欢: var html = ""; html += "
      "; html += "1"; html += "
      ";
    猜你喜欢
    • 2021-03-19
    • 2018-08-08
    • 1970-01-01
    • 2020-04-01
    • 2018-07-09
    • 2021-08-04
    • 1970-01-01
    • 2022-01-24
    • 2019-01-07
    相关资源
    最近更新 更多