Fragmenty

Często spotykanym wzorcem w Reakcie jest tworzenie komponentów, które zwracają wiele elementów. Fragmenty pozwalają zgrupować listę potomków bez konieczności dodawania zbędnych węzłów do drzewa DOM.

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

Istnieje również nowy skrócony zapis do deklarowania fragmentów.

Motywacja

Zdarza się, że potrzebujemy w komponencie zwrócić listę potomków. Rozważmy poniższy przykład:

class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns />
        </tr>
      </table>
    );
  }
}

Aby zapewnić poprawność wyrenderowanego kodu HTML, komponent <Columns /> powinien zwrócić kilka elementów <td>. Gdyby komórki tabeli, zwracane przez funkcję render() komponentu <Columns />, otoczyć np. elementem <div>, powstały w ten sposób kod HTML byłby nieprawidłowy.

class Columns extends React.Component {
  render() {
    return (
      <div>
        <td>Witaj</td>
        <td>Świecie</td>
      </div>
    );
  }
}

daje w rezultacie następującą strukturę dla komponentu <Table />:

<table>
  <tr>
    <div>
      <td>Witaj</td>
      <td>Świecie</td>
    </div>
  </tr>
</table>

Fragmenty rozwiązują ten problem.

Użycie

class Columns extends React.Component {
  render() {
    return (
      <React.Fragment>
        <td>Witaj</td>
        <td>Świecie</td>
      </React.Fragment>
    );
  }
}

daje w rezultacie następującą strukturę dla komponentu <Table />:

<table>
  <tr>
    <td>Witaj</td>
    <td>Świecie</td>
  </tr>
</table>

Skrócony zapis

Istnieje nowy, krótszy zapis służący do deklarowania fragmentów. Z wyglądu przypomina puste znaczniki:

class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Witaj</td>
        <td>Świecie</td>
      </>
    );
  }
}

Możesz używać <></> tak samo, jak innych komponentów. Nie możesz jednak przekazywać do niego klucza (key) ani żadnych innych właściwości.

Fragmenty zadeklarowane jawnie przy użyciu składni <React.Fragment> mogą posiadać klucze. Ma to zastosowanie, gdy zechcesz przemapować kolekcję na tablicę fragmentów — na przykład do stworzenia listy opisów:

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Bez `key` React wyrzuci błąd
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

key jest jedyną właściwością, którą można przekazać do fragmentu. Możliwe, że w przyszłości dodamy wsparcie dla innych właściwości, np. procedur obsługi zdarzeń.

Demo

Możesz wypróbować nową składnię JSX dla fragmentów na tym CodePenie.