Чому JSX вимагає один кореневий елемент?
Коротка відповідь
JSX вимагає один кореневий елемент, тому що React-компонент повинен повертати одне єдине значення - а компіляція JSX перетворює розмітку на виклик React.createElement(), який повертає один об'єкт (React-елемент).
Якщо JSX містить кілька елементів на одному рівні, React не знає, що вважати "головним результатом" функції.
Приклад проблеми
Помилка:
function App() {
return (
<h1>Привіт</h1>
<p>Як справи?</p>
);
}Помилка:
"Adjacent JSX elements must be wrapped in an enclosing tag."
Чому? Тому що це перетворюється на щось на кшталт:
return (
React.createElement("h1", null, "Привіт"),
React.createElement("p", null, "Як справи?")
);Але return може повернути лише одне значення, а не два елементи підряд.
Як правильно
- Обгортаємо елементи у спільний контейнер:
function App() {
return (
<div>
<h1>Привіт</h1>
<p>Як справи?</p>
</div>
);
}- Або використовуємо фрагмент (без зайвого тега в DOM):
function App() {
return (
<>
<h1>Привіт</h1>
<p>Як справи?</p>
</>
);
}Це еквівалент:
return React.createElement(React.Fragment, null,
React.createElement("h1", null, "Привіт"),
React.createElement("p", null, "Як справи?")
);Навіщо це обмеження взагалі потрібне?
React повинен побудувати дерево компонентів (Virtual DOM), і кожен компонент повинен мати рівно одну "кореневу ланку".
Інакше React не зможе:
- коректно визначити, де починається і закінчується компонент;
- оновлювати або видаляти компонент цілком;
- пов'язувати стан і життєвий цикл з одним вузлом у дереві.
Аналогія
Уяви, що в тебе є дерево:
App
┣ Header
┗ FooterЯкщо компонент App поверне два корені (Header і Footer окремо),
то дерево стане "з двома стовбурами" - і React не зможе коректно їх обробити.
Підсумок
JSX вимагає один кореневий елемент, тому що:
returnможе повернути лише одне значення;- React будує ієрархічне дерево компонентів (Virtual DOM);
- один корінь гарантує, що компонент = один вузол дерева.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.