Компонент повертає один кореневий елемент JSX. Щоб повернути кілька елементів без зайвої обгортки в DOM, використовують Fragment:
function UserInfo({ user }) {
return (
<>
<dt>Ім'я</dt>
<dd>{user.name}</dd>
</>
);
}
<>...</> - скорочений запис <Fragment>...</Fragment>. У DOM потрапляють лише dt і dd.
Навіщо не обгортати в <div>:
- валідний HTML: усередині
<dl>,<ul>,<table>,<tr>допустимі лише певні елементи.<div>між<tr>і<td>- некоректна розмітка й попередження React; - CSS-розкладка: у flex- чи grid-контейнері зайвий
<div>стає окремим елементом сітки й ламає розташування; - менше DOM - трохи легше для браузера на великих сторінках.
Fragment з key - коли фрагмент рендериться в циклі. Скорочений запис <> атрибутів не приймає, потрібна повна форма:
import { Fragment } from 'react';
function Glossary({ items }) {
return (
<dl>
{items.map((item) => (
<Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</Fragment>
))}
</dl>
);
}
Що варто знати:
key- єдиний атрибут, який приймає Fragment (в експериментальних версіях з'являється щеref);- Fragment не має власного DOM-вузла - на нього не можна повісити обробник події чи клас;
- збереження стану: React однаково трактує
<>з дітьми і масив дітей на верхньому рівні, тож перехід між<><Child /></>і<Child />не скидає стан. А от зміна позиції в дереві чиkey- скидає.
Повернути масив (return [<li key="a" />, <li key="b" />]) теж можна, але потрібні key на кожному елементі - Fragment читається простіше.