Працюючи над проєктом на 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)