<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
key
optionnel : les fragments déclarés explicitement avec la syntaxe<Fragment>
peuvent avoir une keys.
Limitations
-
Si vous souhaitez utiliser une
key
dans un Fragment, vous ne pouvez pas utiliser la syntaxe<>...</>
. Vous devez explicitement importerFragment
depuis'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> ); }