<Fragment> (<>...</>)
<Fragment>
, часто використовується у синтаксисі <>...</>
, дозволяє групувати елементи без вузла обгортки.
<>
<OneChild />
<AnotherChild />
</>
Довідник
<Fragment>
Обгорніть елементи у <Fragment>
, щоб згрупувати їх разом у ситуаціях, коли вам потрібен один елемент. Групування елементів у Fragment
не впливає на результуючий DOM; він такий самий, як якщо б елементи не були згруповані. Порожній JSX-тег <></>
у більшості випадків є скороченням для <Fragment></Fragment>
.
Пропси
- опціонально
key
: Фрагменти, оголошені з явним синтаксисом<Fragment>
, можуть мати ключі .
Застереження
Якщо ви хочете передати
ключ
Фрагменту, ви не можете використовувати синтаксис<>...</>
. Ви повинні явно імпортуватиFragment
з'react'
і відрендерити<Fragment key={yourKey}>...</Fragment>
.React не скидає стан при переході від рендерингу
<><Child /></>
до[<Child />]
або назад, чи при переході від рендерингу<><Child /></>
до<Child />
і назад. Це працює лише на один рівень вглиб: наприклад, перехід від<><><Child /></></>
до<Child />
скидає стан. Точну семантику дивіться тут.
Використання
Повернення декількох елементів
Використовуйте Fragment
або еквівалентний синтаксис <>...</>
, щоб згрупувати декілька елементів разом. Ви можете використовувати його для розміщення декількох елементів у будь-якому місці, куди може потрапити один елемент. Наприклад, компонент може повернути лише один елемент, але за допомогою фрагмента ви можете згрупувати декілька елементів разом, а потім повернути їх як групу:
function Post() {
return (
<>
<PostTitle />
<PostBody />
</>
);
}
Фрагменти корисні тим, що групування елементів за допомогою фрагмента не впливає на компонування або стилі, на відміну від того, якби ви загорнули елементи в інший контейнер, наприклад, DOM-елемент. Якщо ви перевірите цей приклад за допомогою інструментів браузера, то побачите, що всі DOM-вузли <h1>
і <article>
відображаються як брати і сестри без обгорток навколо них:
export default function Blog() {
return (
<>
<Post title="An update" body="It's been a while since I posted..." />
<Post title="My new blog" body="I am starting a new 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>
);
}
Як написати фрагмент без спеціального синтаксису?
Вищенаведений приклад еквівалентний імпортуванню Fragment
з React:
import { Fragment } from 'react';
function Post() {
return (
<Fragment>
<PostTitle />
<PostBody />
</Fragment>
);
}
Зазвичай вам це не знадобиться, якщо тільки вам не потрібно буде передати ключ
до вашого Fragment
.
Присвоєння декількох елементів змінній
Як і будь-який інший елемент, елементи Fragment можна призначати змінним, передавати як пропси тощо:
function CloseDialog() {
const buttons = (
<>
<OKButton />
<CancelButton />
</>
);
return (
<AlertDialog buttons={buttons}>
Are you sure you want to leave this page?
</AlertDialog>
);
}
Групування елементів за допомогою тексту
Ви можете використовувати Fragment
для групування тексту разом з компонентами:
function DateRangePicker({ start, end }) {
return (
<>
From
<DatePicker date={start} />
to
<DatePicker date={end} />
</>
);
}
Відображення списку фрагментів
Виникає ситуація, коли вам потрібно явно написати Fragment
замість того, щоб використовувати синтаксис <></>
. Коли ви відображаєте декілька елементів у циклі , вам потрібно призначити ключ
для кожного елемента. Якщо елементи всередині циклу є фрагментами, вам потрібно використовувати звичайний синтаксис елементів JSX, щоб надати атрибут key
:
function Blog() {
return posts.map(post =>
<Fragment key={post.id}>
<PostTitle title={post.title} />
<PostBody body={post.body} />
</Fragment>
);
}
Ви можете оглянути DOM, щоб переконатися у відсутності елементів обгортки навколо дочірніх фрагментів:
import { Fragment } from 'react';
const posts = [
{ id: 1, title: 'An update', body: "It's been a while since I posted..." },
{ id: 2, title: 'My new blog', body: 'I am starting a new 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>
);
}