React - 动态渲染一定数量的组件

IT技术 javascript reactjs icons state material-ui
2021-05-07 05:40:02

我想根据用户获得的点数(this.state.points显示多个组件 Star(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;
4个回答

您可以使用空槽数Array.fill创建新数组,this.state.points然后用<Star />组件填充,如下所示:

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

试试这个

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;

这可能有帮助:

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;

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

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

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

现场演示

代码沙盒演示