Fragments
En React, il est courant pour un composant de renvoyer plusieurs éléments. Les fragments nous permettent de grouper une liste d’enfants sans ajouter de nœud supplémentaire au DOM.
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}
Il existe aussi une nouvelle syntaxe concise pour les déclarer.
Motivation
Il est courant qu’un composant renvoie une liste d’enfants. Prenez cette exemple de bout de code React :
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
<Columns />
aurait besoin de renvoyer plusieurs éléments <td>
pour que le HTML obtenu soit valide. Mais si une div parente était utilisée dans le render()
de <Columns />
, alors le HTML résultat serait invalide.
class Columns extends React.Component {
render() {
return (
<div>
<td>Bonjour</td>
<td>Monde</td>
</div>
);
}
}
Ce code donne en sortie le <Table />
suivant :
<table>
<tr>
<div>
<td>Bonjour</td>
<td>Monde</td>
</div>
</tr>
</table>
Les fragments résolvent ce problème.
Usage
class Columns extends React.Component {
render() {
return (
<React.Fragment> <td>Bonjour</td>
<td>Monde</td>
</React.Fragment> );
}
}
Ce qui donne en sortie le <Table />
correct suivant :
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
Syntaxe concise
Il existe une nouvelle syntaxe plus concise, que vous pouvez utiliser pour déclarer des fragments. Ça ressemble à des balises vides :
class Columns extends React.Component {
render() {
return (
<> <td>Bonjour</td>
<td>Monde</td>
</> );
}
}
Vous pouvez utiliser <>…</>
de la même manière que n’importe quel élément, à ceci près que cette syntaxe n’accepte ni clés ni attributs.
Les fragments à clé
Les fragments déclarés explicitement avec la syntaxe <React.Fragment>
peuvent avoir des clés (key, NdT). Un cas d’utilisation consisterait à faire correspondre une collection à un tableau de fragments—par exemple pour créer une liste de descriptions :
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// Sans la `key`, React produira un avertissement spécifique
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}
key
est le seul attribut qui peut être passé à Fragment
. À l’avenir, nous prendrons peut-être en charge des attributs supplémentaires, tels que des gestionnaires d’événements .
Démo interactive
Vous pouvez essayer la nouvelle syntaxe JSX de fragment avec ce CodePen.