Dans React16.2, la prise en charge améliorée de Fragments
a été ajoutée. Plus d'informations peuvent être trouvées sur le blog de React ici.
Nous connaissons tous le code suivant:
render() {
return (
// Extraneous div element :(
<div>
Some text.
<h2>A heading</h2>
More text.
<h2>Another heading</h2>
Even more text.
</div>
);
}
Oui, nous avons besoin d'un conteneur, mais ce n'est pas si grave.
Dans React 16.2, nous pouvons le faire pour éviter le div de conteneur environnant:
render() {
return (
<Fragment>
Some text.
<h2>A heading</h2>
More text.
<h2>Another heading</h2>
Even more text.
</Fragment>
);
}
Dans les deux cas, nous avons toujours besoin d'un élément conteneur qui entoure les éléments internes.
Ma question est la suivante: pourquoi utiliser un Fragment
préférable? Cela aide-t-il avec la performance? Si oui, pourquoi? J'aimerais avoir un aperçu.
div
s au milieu rend difficile la conservation de la présentation souhaitée lors de l'extraction de composants logiques.Vous pouvez trouver les descriptions de quelques autres cas d'utilisation dans ce problème React: Ajout d'une API de fragment pour permettre le renvoi de plusieurs composants à partir du rend
L'ajout à toutes les réponses ci-dessus présente un avantage supplémentaire: lisibilité du code , le composant Fragment
prend en charge une forme sucre syntaxique, <>
. Ainsi, le code de votre question s’écrit plus facilement comme suit:
render() {
return (
<>
Some text.
<h2>A heading</h2>
More text.
<h2>Another heading</h2>
Even more text.
</>
);
}
Selon docs ,
Dans React, cela désugare un élément
<React.Fragment/>
, comme dans l'exemple de la section précédente. (Les frameworks non-React qui utilisent JSX peuvent compiler quelque chose de différent.)
Sans encombrement, non?
Notez que vous devez toujours utiliser la syntaxe <Fragment>
si vous devez fournir key
au fragment.
C'est aussi simple que lorsque vous n'avez pas besoin d'un élément wrapper, vous n'êtes pas obligé de l'utiliser. Avoir moins d'éléments, c'est bien, mais je pense que le principal avantage est de pouvoir restituer des éléments dans jsx qui n'étaient pas possibles auparavant et d'ajouter une meilleure signification sémantique aux éléments d'emballage, car ils sont maintenant facultatifs.
Ce n'était pas possible avant:
<select>
{this.renderOptions()}
</select>
En examinant les éléments suivants dans React 15, vous ne pouvez pas savoir si l'élément wrapper est nécessaire ou non:
<span>
<h1>Hello</h1>
{this.getContent()}
</span>
Selon reatjs.org docs , les besoins les plus importants de <Fragments> <Fragments/>
au lieu de div sont d'éviter de rompre la sémantique HTML. Lorsque nous utilisons div au lieu de <Fragments> <Fragments/>
, nous cassons la sémantique HTML. en savoir plus sur la sémantique HTML. s'il vous plaît cliquez et il y a aussi des cas où si vous utilisez div au lieu de Fragments, il sera invalide html par exemple, regardez ce code.
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
Result in table output of Columns Component
<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
Les fragments résolvent ce problème.