如何使用JSX重复一次元素n次

Sti*_*ead 52 javascript lodash react-jsx

我在我的应用程序中使用React/JSX以实现我想要的,Lodash.

我需要根据条件重复一个元素一定次数,我该怎么做?

这是元素:

<span className="busterCards">?</span>;

我这样分配它:

    let card;
    if (data.hand === '8 or more cards') {
      card = <span className="busterCards">?</span>;
    }
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,我需要重复8次元素.使用Lodash的过程应该是什么?

Wai*_*ski 138

没有任何外部库的最短方法:

const n = 8; // Or something else

[...Array(n)].map((e, i) => <span className="busterCards" key={i}>?</span>)
Run Code Online (Sandbox Code Playgroud)

  • 非lodash用户的真棒答案!值得指出它确实需要ES6功能(尽管我认为无论如何在问题中使用'let`意味着它). (5认同)
  • 对于那些使用Typescript 2+的人来说,这将编译成`Array(3).slice().map(...)`,它们没有达到相同的效果.请参阅@ Jian的答案作为替代. (4认同)
  • @KevinWang,因为您的建议将创建一个长度为8的“空”数组,而不是由8个未定义项组成的数组。迭代不适用于前者。在控制台中将其卡住以查看区别。 (4认同)
  • 为什么不能只是`Array(n).map((e, i) =&gt; &lt;span className="busterCards" key={i}&gt;♦&lt;/span&gt;)` (2认同)

Jia*_*ang 24

没有lodash或ES6传播语法的解决方案:

Array.apply(null, { length: 10 }).map((e, i) => (
  <span className="busterCards" key={i}>
    ?
  </span>
));
Run Code Online (Sandbox Code Playgroud)


Lon*_*yen 21

干得好:

let card = [];
_.times(8, () => {
  card.push(<span className="busterCards">?</span>);
});
Run Code Online (Sandbox Code Playgroud)

您可能希望为每个span元素添加键,以便React不会抱怨错过键属性:

let card = [];
_.times(8, (i) => {
  card.push(<span className="busterCards" key={i}>?</span>);
});
Run Code Online (Sandbox Code Playgroud)

有关详细信息.times,请参阅此处:https://lodash.com/docs#times

  • 我试图将它分配给`let card`,但它没有重复该元素 (2认同)

Pri*_*ras 16

我正在使用这个并且为我工作。

[...Array(10)].map((elementInArray, index) => ( 
    <div key={index}>
      Text in Loop
    </div>
))
Run Code Online (Sandbox Code Playgroud)


paw*_*wel 7

使用_.timeshttps : //jsfiddle.net/v1baqwxv/

var Cards = React.createClass({
    render() {
        return <div>cards {
          _.times( this.props.count, () => <span>?</span> )
        }</div>;
    }
});
Run Code Online (Sandbox Code Playgroud)


All*_*lan 6

你可以这样做(没有lodash):

var numberOfCards = 8; // or more.

if (data.hand >= numberOfCards) {
    var cards = [];

    for (var i = 0; i < numberOfCards; i++) {
        cards[i] = (<span className="busterCards">?</span>);
    }
}
Run Code Online (Sandbox Code Playgroud)


per*_*mon 6

无需任何外部库即可直接选择的方法(2021):

\n
// straight forward but without key index. Not so good for react but work fine with worning \nArray(X).fill(<span className="busterCards">\xe2\x99\xa6</span>)\n// with index\nArray(X).fill().map((v,i)=> <span className="busterCards">\xe2\x99\xa6</span>)\n
Run Code Online (Sandbox Code Playgroud)\n
Array.from( Array(X), (v,i) => <span key={i} className="busterCards">\xe2\x99\xa6</span> )\n// same thing basically \nArray.from( {length:X}, (v,i) => <span key={i} className="busterCards">\xe2\x99\xa6</span> )\n
Run Code Online (Sandbox Code Playgroud)\n
[...Array(3)].map( (_,i)=> <span key={i} className="busterCards">\xe2\x99\xa6</span> )\n
Run Code Online (Sandbox Code Playgroud)\n


San*_*ath 5

<section>
      {Array.from({ length: 10 }, (_, i) => <span key={i}>Your text</span>)}
 </section>
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

Array.from() 在两种情况下使用:

  1. 从类似数组的数据结构创建数组。例如,我们可以使用以下方法将地图转换为数组Array.from()

    const map = new Map([ [1, 2], [3, 4], [4, 5] ])

    console.log(Array.from(map)) //gives an array - [[1, 2], [3, 4], [4, 5]]

  2. 创建一个数组并填写值(当我们需要创建一个包含更多元素的数组时,这会很方便)

Array.from() 接受一个对象和一个回调函数。

Array.from({ length: 7 }, (() => 10)) // gives [10,10,10,10,10,10,10]

我们可以利用回调函数中的索引(第二个参数)来提供唯一的数组元素

Array.from({ length: 4 }, ((_, i) => i + 1)) // [1,2,3,4]

  • 虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。 (3认同)
  • `Array.from` 比 `[...Array(n)]` 更容易阅读/理解 (2认同)