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.