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.