Fragments
Es kommt häufig vor, dass eine Komponente mehrere Elemente umfasst. Mit Fragments kannst du eine Liste von Kindelementen gruppieren, ohne dem DOM einen zusätzlichen Knoten hinzuzufügen.
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}
Es gibt auch eine neue Kurzschreibweise um diese zu deklarieren.
Motivation
Gängig ist, dass eine Komponente eine Liste von Kindelementen zurückgibt. Nehmen wir diesen React-Schnipsel:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
<Columns />
muss mehrere <td>
Elemente zurückgeben, damit das gerenderte HTML gültig ist. Wenn ein übergeordnetes div in render()
von <Columns />
verwendet werden würde, würde das resultierende HTML ungültig sein.
class Columns extends React.Component {
render() {
return (
<div>
<td>Hallo</td>
<td>Welt</td>
</div>
);
}
}
Eine Ausgabe von <Table />
ergibt dann folgendes:
<table>
<tr>
<div>
<td>Hallo</td>
<td>Welt</td>
</div>
</tr>
</table>
Fragmente lösen dieses Problem.
Verwendung
class Columns extends React.Component {
render() {
return (
<React.Fragment> <td>Hallo</td>
<td>Welt</td>
</React.Fragment> );
}
}
dies resultiert in einer korrekten Ausgabe von <Table />
:
<table>
<tr>
<td>Hallo</td>
<td>Welt</td>
</tr>
</table>
Kurzschreibweise
Es gibt eine neue kürzere Schreibweise, welche du verwenden kannst um Fragmente zu deklarieren. Diese sieht wie leere Tags aus:
class Columns extends React.Component {
render() {
return (
<> <td>Hallo</td>
<td>Welt</td>
</> );
}
}
Du kannst <></>
so verwenden, wie du jedes andere Element verwendest. Mit Ausnahme davon, dass es keine Keys oder andere Attribute unterstützt.
Keyed Fragments
Fragmente, die mit der expliziten <React.Fragment>
Syntax deklariert wurden, können Keys besitzen. Ein Anwendungsfall dafür ist das Durchlaufen von Daten um ein Array von Fragmenten zu erzeugen, z.B. um eine Beschreibungsliste zu erstellen:
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// Ohne `key`, wird React eine Key-Warnung ausgeben
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}
key
ist das einzige Attribut, welches an ein Fragment
gegeben werden kann. Zukünftig könnten wir die Unterstützung für zusätzliche Attribute hinzufügen, wie z. B. Event-Handler.
Live Demo
Du kannst die neue JSX Fragment Syntax auf CodePen ausprobieren.