Працюючи над проєктом на React, я замислився: чому JSX не рендерить цикл for, тоді як функція map працює бездоганно?
Це просте питання привело мене до розуміння ключової відмінності між тим, як працюють цикли for і функція map у JavaScript — та як вони узгоджуються з вимогами JSX.
Ключова відмінність
Головна причина, чому цикли for не працюють у JSX, полягає в їх природі:
- Цикли
for— це оператори: Циклforє імперативним оператором (imperative statement), тобто виконує певну послідовність дій, але сам по собі не повертає значення. JSX очікує вирази (expressions), які повертають значення для рендерингу, а циклиforне відповідають цій вимозі. map— це вираз: Натомістьmapє функціональним методом, який трансформує масив і повертає новий масив, зазвичай із JSX-елементами, якщо використовується у React. Повернений масив ідеально підходить для JSX, щоб рендерити компоненти інтерфейсу.
Приклад: for проти map
Ось практичне порівняння:
Використання циклу for (не підтримується напряму в JSX)
const items = [1, 2, 3];
const elements = [];
for (let i = 0; i < items.length; i++) {
elements.push(
{items[i]}
);
}
return
{elements}
;
Такий підхід працює, але ви не можете напряму використовувати цикл for у JSX. Вам потрібен зовнішній масив (elements), щоб накопичувати JSX-елементи, а потім рендерити їх. Це менш зручний і більш ручний підхід.
Використання map (чистий і декларативний підхід)
const items = [1, 2, 3];
return (
{items.map((item, index) => (
{item}
))}
);
Тут map напряму перетворює масив у JSX-елементи і повертає їх, що робить код коротким, чистим і повністю сумісним із JSX.
Використання циклів for у JSX можливо, але незручно
Якщо ви хочете використовувати цикл for у JSX, вам доведеться створити масив елементів вручну поза JSX і потім включити його у JSX.
Приклад:
const items = [1, 2, 3];
const elements = [];
for (let i = 0; i < items.length; i++) {
elements.push(
{items[i]}
);
}
return
{elements}
;
Цей підхід працює, але він менш елегантний порівняно з map, тому що:
- Вам потрібен зовнішній масив
elementsдля накопичення JSX. - Це додає зайві кроки і використовує змінний стан (mutable state) через
elements.push.
Чому розробники React віддають перевагу map
- Декларативний синтаксис: Функція
mapнапряму інтегрується з JSX і повертає новий масив, уникаючи зовнішнього змінного стану. - Чистий код:
mapскорочує зайві рядки і робить код читабельнішим. - Функціональний стиль: React дотримується принципів функціонального програмування, і
mapкраще відповідає цьому підходу.
Висновок:
- Цикли
forне можна напряму використовувати у JSX, оскільки JSX очікує виразів, аforє оператором. mapпрацює ідеально, оскільки повертає масив, який JSX може рендерити.- Ви можете використовувати цикл
forпоза JSX для створення масиву вручну, але це менш зручно і суперечить декларативному стилю React.
Якщо вам потрібна допомога у рефакторингу прикладів для використання map або більш чистого підходу, звертайтеся! 😊
Перекладено з: Why for Loops Don't Work in JSX (and Why map Does)