Как известно, любой компонент React должен содержать только один корневой элемент. В некоторых случаях это неудобно, например, в случае с таблицей, нам бы хотелось иметь компонент, содержащий только ячейки таблицы, но тогда их придется "обернуть" в блок:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
Где компонент Column:
class Columns extends React.Component {
render() {
return (
<div> {/* необходимый корневой элемент */}
<td>Hello</td>
<td>World</td>
</div>
);
}
}
В результате получаем не совсем то, что нужно.
<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
Для решения этой задачи разработан общий шаблон (common pattern) React Fragments, который позволяет добавлять в компонент группу дочерних элементов без корневого элемента. Использование React Fragments:
class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
Существует также короткий синтакс:
class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
Для вывода элементов массива, например при помощи функции map, содержащих React Frragment можно использовать ключи:
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>
);
}