【问题标题】:React - Render a certain number of components dynamicallyReact - 动态渲染一定数量的组件
【发布时间】:2018-11-26 15:10:49
【问题描述】:

我想根据用户获得的点数(this.state.points)显示一个组件星号(MUI 组件)。

我不知道该怎么做。

import React, { Component } from "react";
import { Star } from "@material-ui/icons";

Points extends Component {
  constructor(props) {
  super(props);
    this.state = {
      points: 6
    };
  }

  render() {
     return (
       <div>
         <p>
           + {this.state.points} points
           <Star />
         </p>
       </div>
     );
    }
  }

export default Points;

【问题讨论】:

  • 迭代并返回组件?我不清楚问题是什么。
  • material-ui 是哪个版本的?
  • 点应该是一个类。
  • 我要显示6颗星,这是一个“类”,我复制粘贴时出错了,它是material-ui的最新版本

标签: javascript reactjs icons state material-ui


【解决方案1】:

接受的答案使用不好的做法,如果它在列表中,您应该将 key 传递给您的组件:

Array(10).fill(0).map((_, i) => <YourComponent key={i} />)
  • Array(10):创建一个可以容纳 10 个值的空数组(将 10 替换为代码中的动态值)。
  • .fill(0):用一些虚拟值填充它,比如0。该数组现在填充了 0 10 次。
  • .map((_, i) =&gt; (...)):将0 的数组转换为YourComponent 的数组。您可以将未使用参数的名称更改为 _ 以从 ESLint 中删除 no-unused-vars 警告。

现场演示

【讨论】:

    【解决方案2】:

    这可能会有所帮助:

    import React, { Component } from "react";
    import { Star } from "@material-ui/icons";
    
    class Points extends Component {
      constructor(props) {
        super(props);
        this.state = {
          points: 6
        };
      }
    
      getUserStars() {
        let i = 0;
        let stars = [];
        while (i < this.state.points) {
          i++;
          stars.push(<Star />);
        }
        return stars;
      }
    
      render() {
        return <div>{this.getUserStars(this.state.points)}</div>;
      }
    }
    
    export default Points;
    

    您只需要迭代一个循环并在数组中收集星星并在渲染中调用该函数,这样每当状态更新时,该函数就会调用并且星星也会更新。

    【讨论】:

      【解决方案3】:

      您可以使用Array.fill 创建具有this.state.points 数量的空槽的新数组,然后使用&lt;Star /&gt; 组件填充,如下所示:

      import React, { Component } from "react";
      import { Star } from "@material-ui/icons";
      
      class Points extends Component {
        constructor(props) {
          super(props);
          this.state = {
            points: 6
          };
        }
      
        render() {
          return (
            <div>
              <p>
                + {this.state.points} points
                // This is where the magic happens
                {Array(this.state.points).fill(<Star />)}
              </p>
            </div>
          );
        }
      }
      
      export default Points;
      

      这是一个工作沙盒:https://codesandbox.io/s/vj3xpyn0x0

      【讨论】:

      • 不错的解决方案??
      【解决方案4】:

      试试这个

      import React, { Component } from "react";
      import { Star } from "@material-ui/icons";
      
      Points extends Component {
      constructor(props) {
      super(props);
      this.state = {
        points: 6
       };
      }
      
      render() {
       return (
         <div>
           <p>
             + {this.state.points} points
      
             {Array.from(Array(this.state.points)).map((x, index) => <Star key={index} />)}
           </p>
          </div>
        );
        }
      }
      
      export default Points;
      

      【讨论】:

      • 我们正在创建一个点长度的数组。 Array(n) 返回一个空数组,Array.from 创建数组,我们可以在其中执行所有数组原型。因为我们应该在反应中拥有所有数组元素的键,所以我们使用map 函数。
      • 不要在这里发布,而是编辑你的答案......阅读stackoverflow.com/help/how-to-answer
      猜你喜欢
      • 2014-12-18
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2018-07-02
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多