React Fragments позволяют группировать несколько JSX-элементов без добавления лишних DOM-узлов. Вот полное руководство по их применению в реальных проектах.
import React from 'react';
function TableRows() {
return (
<React.Fragment>
<tr><td>Строка 1</td></tr>
<tr><td>Строка 2</td></tr>
</React.Fragment>
);
}
function ListItems() {
return (
<>
<li>Элемент 1</li>
<li>Элемент 2</li>
</>
);
}
Фрагменты с ключами полезны при рендеринге списков:
function Glossary({ terms }) {
return (
<dl>
{terms.map(term => (
<React.Fragment key={term.id}>
<dt>{term.name}</dt>
<dd>{term.description}</dd>
</React.Fragment>
))}
</dl>
);
}
Важно: Сокращённый синтаксис <> </>
не поддерживает атрибут key!
function UserProfile({ user }) {
return (
<div className="profile">
<h1>{user.name}</h1>
{user.isAdmin && (
<>
<AdminControls />
<AuditLog />
</>
)}
</div>
);
}
Без фрагментов это невозможно - JSX требует единого корневого элемента:
function Columns() {
// Без Fragment пришлось бы использовать div, что может сломать вёрстку
return (
<>
<td>Контент 1</td>
<td>Контент 2</td>
</>
);
}
Пример с таблицей, где лишний div сломает структуру:
function DataTable({ data }) {
return (
<table>
<tbody>
{data.map(row => (
// Без Fragment здесь появился бы лишний div!
<React.Fragment key={row.id}>
<tr><td>{row.name}</td></tr>
<tr><td>{row.value}</td></tr>
</React.Fragment>
))}
</tbody>
</table>
);
}
Хотя фрагменты не создают DOM-узлов, их можно использовать с ref:
function FocusableGroup() {
const ref = useRef();
const focusFirst = () => {
ref.current.querySelector('button').focus();
};
return (
<div ref={ref}>
<>
<button onClick={focusFirst}>Кнопка 1</button>
<button>Кнопка 2</button>
</>
</div>
);
}
key
(в полной версии)Если нужна обёртка со стилями, используйте semantic-элементы:
function ArticleSections() {
return (
<article> {/* Вместо Fragment когда нужна семантика */}
<section>...</section>
<section>...</section>
</article>
);
}
React Fragments — это простой, но мощный инструмент для группировки элементов без лишних DOM-узлов. Используйте:
<> </>
для простых случаев<React.Fragment>
когда нужны ключи