Unetway

ReactJS - Фрагменты

Общим примером в React является компонент для возврата нескольких элементов. Фрагменты позволяют группировать список детей без добавления дополнительных узлов в DOM.

render() {
  return (
    <React.Fragment>
      <ChildA />
      <ChildB />
      <ChildC />
    </React.Fragment>
  );
}

Мотивация (Motivation)

Общим примером является компонент, который возвращает список дочерних элементов. Возьмем этот пример: отредактируем фрагмент:

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>Hello</td>
        <td>World</td>
      </div>
    );
  }
}

приводит к <Table /> результату:

<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>

Итак, введем Fragments.

Применение

class Columns extends React.Component {
  render() {
    return (
      <React.Fragment>
        <td>Hello</td>
        <td>World</td>
      </React.Fragment>
    );
  }
}

что приводит к правильному <Table /> выводу:

<table>
  <tr>
    <td>Hello</td>
    <td>World</td>
  </tr>
</table>

Короткий синтаксис

Существует новый, более короткий синтаксис, который можно использовать для объявления фрагментов. Он выглядит как пустые теги:

class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Hello</td>
        <td>World</td>
      </>
    );
  }
}

Вы можете использовать <></> то же самое, что и любой другой элемент, за исключением того, что он не поддерживает ключи или атрибуты. Обратите внимание, что многие инструменты еще не поддерживают его, поэтому вы можете явно писать <React.Fragment> до тех пор, пока инструмент не настигнет.

Ключ-фрагменты

Фрагменты, объявленные с явным <React.Fragment> синтаксисом, могут иметь ключи. Вариант использования для этого - сопоставление коллекции с массивом фрагментов - например, для создания списка описания:

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Without the `key`, React will fire a key warning
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

keyэто единственный атрибут, который можно передать Fragment. В будущем мы можем добавить поддержку дополнительных атрибутов, таких как обработчики событий.