Этот сайт больше не обновляется.Перейдите на react.dev

Фрагменты

These docs are old and won’t be updated. Go to react.dev for the new React docs.

These new documentation pages teach modern React:

Возврат нескольких элементов из компонента является распространённой практикой в 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.