Допустим, у вас есть компонент React с именем ComponentA, и вы хотите отображать его в определенное время. Есть 3 способа достичь цели.
1. Для цикла
Старомодный способ. Большинству людей легко приходит в голову эта идея, если они программисты. Вы просто помещаете компонент в массив в цикле for. А затем визуализировать массив.
const COUNT = 10 const ComponentA = () => <div>test</div>; export default function App() { const arr = []; for (let i = 0; i < COUNT; i += 1) { arr.push(<ComponentA key={i}/>); } return <>{arr}</>; }
2. Массив определенной длины и карта с оператором расширения
const COUNT = 10 const ComponentA = () => <div>aaaa</div>; export default function App() { return ( <> {[...Array(COUNT)].map((_, index) => ( <ComponentA key={index} /> ))} </> ); }
Если вы используете метод карты для массива с определенной длиной, как показано ниже, он терпит неудачу.
{Array(COUNT).map((_, index) => ( <ComponentA key={index} /> ))}t
Это связано с тем, что Array(Count) только что создал пустой массив длиной COUNT, а map возвращает пустой массив. Вы можете проверить это в своем браузере.
Однако, когда вы используете оператор распространения, массив будет иметь такое же количество элементов, как и его длина.
3. Массив определенной длины и сопоставления без использования оператора спреда
Возможно, кто-то из читателей это уже заметил. Да, вы можете сделать то же самое, что и предыдущий вариант. На самом деле, оператор расширения — не единственный способ получить массив с таким же количеством элементов, как и его длина.
Например, вы также можете использовать Array.from, как показано ниже.
const COUNT = 10 const ComponentA = () => <div>aaaa</div>; export default function App() { return ( <> {Array.from({length: COUNT}).map((_, index) => ( <ComponentA key={index} /> ))} </> ); }
Вы также можете использовать метод .fill для заполнения массива элементами.
const COUNT = 10 const ComponentA = () => <div>aaaa</div>; export default function App() { return ( <> {Array(COUNT).fill().map((_, index) => ( <ComponentA key={index} /> ))} </> ); }