Spec-Zone.ru › React 17

Фрагменты

Распространённый шаблон в 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 был валидным. Если внутри render() элемента <Columns /> использовать родительский div, то получившийся 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>

Фрагменты решают эту проблему.

Использование

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>, могут иметь ключи. Пример использования — отображение коллекции в массив фрагментов, например, для создания списка описаний:

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. В будущем мы можем добавить поддержку дополнительных атрибутов, например, обработчиков событий.

Живая демонстрация

Вы можете опробовать новый синтаксис JSX фрагментов с помощью этой CodePen.

Полезная ли эта страница?

© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://17.reactjs.org/docs/fragments.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API