Фрагменты
Возврат нескольких элементов из компонента является распространённой практикой в React. Фрагменты позволяют формировать список дочерних элементов, не создавая лишних узлов в DOM.
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}Также существует сокращённая запись.
Мотивация
Возврат списка дочерних элементов из компонента — распространённая практика. Рассмотрим пример на React:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}<Columns /> должен вернуть несколько элементов <td>, чтобы HTML получился валидным. Если использовать div как родительский элемент внутри метода render() компонента <Columns />, то HTML окажется невалидным.
class Columns extends React.Component {
render() {
return (
<div>
<td>Привет</td>
<td>Мир</td>
</div>
);
}
}Результатом вывода <Table /> будет:
<table>
<tr>
<div>
<td>Привет</td>
<td>Мир</td>
</div>
</tr>
</table>Фрагменты решают эту проблему.
Использование
class Columns extends React.Component {
render() {
return (
<React.Fragment> <td>Привет</td>
<td>Мир</td>
</React.Fragment> );
}
}Результатом будет правильный вывод <Table />:
<table>
<tr>
<td>Привет</td>
<td>Мир</td>
</tr>
</table>Сокращённая запись
Существует сокращённая запись объявления фрагментов. Она выглядит как пустые теги:
class Columns extends React.Component {
render() {
return (
<> <td>Привет</td>
<td>Мир</td>
</> );
}
}Можно использовать <></> так же, как используется любой другой элемент. Однако такая запись не поддерживает ключи или атрибуты.
Фрагменты с ключами
Фрагменты, объявленные с помощью <React.Fragment>, могут иметь ключи. Например, их можно использовать при создании списка определений, преобразовав коллекцию в массив фрагментов.
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// Без указания атрибута `key`, React выдаст предупреждение об его отсутствии
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}key — это единственный атрибут, допустимый у Fragment. В будущем мы планируем добавить поддержку дополнительных атрибутов, например, обработчиков событий.
Живой пример
Новый синтаксис JSX фрагментов можно попробовать на CodePen.