<Fragment> (<>...</>)
<Fragment>, qu’on utilise souvent via la syntaxe <>...</>, vous permet de grouper des éléments sans balise enrobante.
<>
<OneChild />
<AnotherChild />
</>Référence
<Fragment>
Englober des éléments dans un <Fragment> pour les grouper dans des situations ou vous avez besoin d’un seul élément. Grouper des éléments dans un <Fragment> n’a pas d’effet sur le DOM rendu ; c’est comme si les éléments n’étaient pas groupés. La balise vide <></> en JSX est utilisée la plupart du temps afin de raccourcir l’écriture de <Fragment></Fragment>.
Props
keyoptionnel : les fragments déclarés explicitement avec la syntaxe<Fragment>peuvent avoir une keys.
Limitations
-
Si vous souhaitez utiliser une
keydans un Fragment, vous ne pouvez pas utiliser la syntaxe<>...</>. Vous devez explicitement importerFragmentdepuis'react'et écrire<Fragment key={yourKey}>...</Fragment>. -
React ne réinitialise pas l’état quand vous passez de rendre
<><Child /></>à[<Child />]et inversement, ou ni si vous passez de rendre<><Child /></>à<Child />et inversement. Ça marche seulement à un niveau plus profond : par exemple, passer de<><><Child /></></>à<Child />réinitialise l’état. Consultez la sémantique précise ici.
Utilisation
Renvoyer plusieurs éléments
Utilisez Fragment, ou la syntaxe équivalente <>...</>, afin de grouper plusieurs éléments ensemble. Vous pouvez l’utiliser pour mettre plusieurs éléments à la place d’un élément. Par exemple, un composant ne peut renvoyer qu’un élément unique, mais avec un Fragment vous pouvez grouper plusieurs éléments et renvoyer ce groupe :
function Post() {
return (
<>
<PostTitle />
<PostBody />
</>
);
}Les Fragments sont utiles car grouper des éléments avec un Fragment n’as pas d’effet sur la mise en page ou les styles, contrairement à l’utilisation d’un autre balise englobante du DOM. Si vous inspectez cet exemple avec les outils du navigateur, vous verrez que toutes les balises <h1> et <p> du DOM apparaissent en tant frères et sœur sans balise englobante :
export default function Blog() { return ( <> <Post title="Une mise à jour" body="Ça fait un moment que je n’ai pas posté..." /> <Post title="Mon nouveau blog" body="Je démarre un nouveau blog !" /> </> ) } function Post({ title, body }) { return ( <> <PostTitle title={title} /> <PostBody body={body} /> </> ); } function PostTitle({ title }) { return <h1>{title}</h1> } function PostBody({ body }) { return ( <article> <p>{body}</p> </article> ); }
Deep Dive
L’exemple ci-dessus est equivalent à importer Fragment depuis React :
import { Fragment } from 'react';
function Post() {
return (
<Fragment>
<PostTitle />
<PostBody />
</Fragment>
);
}Normalement vous n’aurez pas besoin d’utiliser ça à moins d’avoir besoin de donner des key à votre Fragment.
Affecter plusieurs éléments à une variable
Comme pour tous les autres éléments, vous pouvez affecter des Fragment à des variables, les passer en tant que props, etc. :
function CloseDialog() {
const buttons = (
<>
<OKButton />
<CancelButton />
</>
);
return (
<AlertDialog buttons={buttons}>
Êtes vous sûr·e de vouloir quitter cette page ?
</AlertDialog>
);
}Grouper des éléments et du texte
Vous pouvez utiliser Fragment pour grouper du texte et des éléments :
function DateRangePicker({ start, end }) {
return (
<>
De
<DatePicker date={start} />
à
<DatePicker date={end} />
</>
);
}Afficher une liste de Fragments
Voici une situation ou vous avez besoin d’écrire explicitement Fragment plutôt que d’utiliser la syntaxe <></>. Quand vous rendez plusieurs éléments dans une boucle, vous avez besoin d’assigner une key à chaque élément. Si les éléments compris dans une boucle sont des Fragments, vous devez utiliser la syntaxe classique JSX afin de fournir l’attribut key :
function Blog() {
return posts.map(post =>
<Fragment key={post.id}>
<PostTitle title={post.title} />
<PostBody body={post.body} />
</Fragment>
);
}Vous pouvez inspecter le DOM pour vérifier qu’il n’y a pas de balise englobante autour des enfants du Fragment :
import { Fragment } from 'react'; const posts = [ { id: 1, title: 'Une mise à jour', body: 'Ça fait un moment que je n’ai pas posté...' }, { id: 2, title: 'Mon nouveau blog', body: 'Je démarre un nouveau blog !' } ]; export default function Blog() { return posts.map(post => <Fragment key={post.id}> <PostTitle title={post.title} /> <PostBody body={post.body} /> </Fragment> ); } function PostTitle({ title }) { return <h1>{title}</h1> } function PostBody({ body }) { return ( <article> <p>{body}</p> </article> ); }