<Fragment> 通常使用 <>...</> 語法,讓您可以在沒有包裝器節點的情況下將元素分組。
<>
<OneChild />
<AnotherChild />
</>參考
<Fragment>
將元素包在 <Fragment> 中,以便在您需要單個元素的情況下將它們組合在一起。在 Fragment 中組合元素不會影響產生的 DOM;這與不組合元素相同。在多數情況下,空的 JSX 標籤 <></> 是 <Fragment></Fragment> 的簡寫。
屬性
- 選用
key:使用明確的<Fragment>語法宣告的 Fragment 可以有 keys。
注意事項
-
如果您想將
key傳遞給 Fragment,則不能使用<>...</>語法。您必須從'react'顯式導入Fragment並且渲染<Fragment key={yourKey}>...</Fragment>。 -
當您從渲染 `
<><Child /></>切換到[<Child />]或反向切換,或者當您從渲染<><Child /></>切換到<Child />或反向切換時,React 並不會重設狀態。這僅在單一層級深度有效:例如,從<><><Child /></></>切換到<Child />就會重設狀態。確切的語義請參見這裡。
用法
返回多個元素
使用 Fragment 或等效的 <>...</> 語法,將多個元素組合在一起。您可以使用它將多個元素放在任何可以放置單個元素的地方。例如,一個組件只能返回一個元素,但透過使用 Fragment,您可以將多個元素組合在一起,然後將它們作為一個群組返回。
function Post() {
return (
<>
<PostTitle />
<PostBody />
</>
);
}Fragment 很有用,因為與將元素包裝在另一個容器(如 DOM 元素)中不同,使用 Fragment 對元素進行分組不會影響佈局或樣式。如果您使用瀏覽器工具檢查此範例,您會看到所有 <h1> 和 <article> DOM 節點都以兄弟節點的形式出現,而沒有任何包裝器。
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> ); }
深入探討
上面的例子等同於從 React 導入 Fragment。
import { Fragment } from 'react';
function Post() {
return (
<Fragment>
<PostTitle />
<PostBody />
</Fragment>
);
}通常您不需要這樣做,除非您需要將 key 傳遞給您的 Fragment。
將多個元素賦值給變數
像任何其他元素一樣,您可以將 Fragment 元素賦值給變數、將它們作為 props 傳遞,等等。
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 列表
以下情況下,您需要明確編寫 Fragment,而不是使用 <></> 語法。當您在迴圈中渲染多個元素時,您需要為每個元素分配一個 key。如果迴圈中的元素是 Fragment,則您需要使用普通的 JSX 元素語法來提供 key 屬性。
function Blog() {
return posts.map(post =>
<Fragment key={post.id}>
<PostTitle title={post.title} />
<PostBody body={post.body} />
</Fragment>
);
}您可以檢查 DOM 以驗證 Fragment 子元素周圍沒有包裝器元素。
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> ); }