Cách lặp lại một phần tử n lần bằng JSX


86

Tôi đang sử dụng React / JSX trong ứng dụng của mình để đạt được những gì tôi muốn, đồng thời, Lodash.

Tôi cần lặp lại một phần tử một số lần nhất định tùy thuộc vào điều kiện. Tôi nên làm điều đó như thế nào?

Đây là phần tử:

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

Và tôi đang gán nó như thế này:

let card;
if (data.hand === '8 or more cards') {
  card = <span className='busterCards'></span>;
}

Vì vậy, trong trường hợp này, tôi cần lặp lại phần tử 8times. Quá trình sử dụng Lodash sẽ như thế nào?


4
Làm thế nào về new Array(8).join('<span className="busterCards">♦</span>');?
undefined

1
Giải pháp mà @Vohuman đề xuất là một cách rất dễ dàng để hoàn thành công việc. Không có chức năng so sánh được xác định trong tài liệu lodash .
Dan Beghin

2
@Vohuman nó sẽ tạo ra một chuỗi, trong khi OP muốn tạo DOM bằng cú pháp JSX.
pawel

1
@Vohuman thật kỳ lạ nhưng tôi đang kết xuất toàn bộ chuỗi
StillDead

1
@pawel bạn nói đúng, bạn có biết làm thế nào tôi có thể làm điều đó?
StillDead

Câu trả lời:


31

Của bạn đây:

let card = [];
_.times(8, () => {
  card.push(<span className="busterCards"></span>);
});

Bạn có thể muốn thêm khóa vào từng spanphần tử để React không phàn nàn về việc thiếu thuộc tính khóa:

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

Để biết thêm thông tin chi tiết .times, tham khảo tại đây: https://lodash.com/docs#times


1
Tôi đang cố gắng gán điều này cho let card, nhưng nó không lặp lại phần tử
StillDead

1
Hoặc đơn giảnconst card = _(8).times(idx => <span key=${idx} className="busterCards">♦</span>);
tokland,

1
Bạn cũng có thể chỉ cần trả về _.times (.....) để hiển thị các phần tử. Đảm bảo rằng bạn cũng sử dụng return (<Element> </ Element) bên trong.
msqar

257

Cách ngắn nhất để làm điều này mà không cần bất kỳ thư viện bên ngoài nào :

const n = 8; // Or something else

[...Array(n)].map((e, i) => <span className="busterCards" key={i}></span>)

10
Câu trả lời tuyệt vời cho người dùng không đăng ký! Đáng chỉ ra rằng nó yêu cầu các tính năng ES6 (mặc dù tôi nghĩ nó được ngụ ý bằng cách sử dụng lettrong câu hỏi).
pseudoramble

6
Đối với những người sử dụng Typecript 2+, điều này sẽ biên dịch thành Array(3).slice().map(...)mà không đạt được kết quả tương tự. Hãy xem câu trả lời của @ Jian dưới đây để thay thế.
Pierre vDEV

Nice, thấy tôi trả lời mà trau chuốt hơn
vsync

2
Tại sao điều này không thể chỉ làArray(n).map((e, i) => <span className="busterCards" key={i}>♦</span>)
Kevin Wang

6
@KevinWang vì đề xuất của bạn sẽ tạo ra một mảng trống có độ dài là 8, thay vì một mảng bao gồm 8 mục không xác định. Lặp lại sẽ không hoạt động trên cái trước. Chuck nó trong bảng điều khiển để thấy sự khác biệt.
Darbio

43

giải pháp không có lodash hoặc cú pháp lây lan ES6:

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

đây là câu trả lời hay nhất IMHO
Uriel


3

Bạn có thể làm như thế này (không cần 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>);
    }
}

1

Bạn có thể tạo một mảng với bao nhiêu mục mà bạn cần hiển thị và sau đó ánh xạ qua mảng để hiển thị đúng số phần tử bạn cần.

const totalItems = 8;

const items = new Array(totalItems).fill(null);


// .... then
return (
    {items.map((_, idx) => <span className="busterCards" key = {idx}></span>)}
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.