React Fragment 和空標(biāo)簽(<></>)用法及區(qū)別詳解
1. 基本概念
1.1 Fragment 的作用
Fragment 允許你將子元素列表組合,而無(wú)需向 DOM 添加額外節(jié)點(diǎn)。它解決了 React 組件必須有一個(gè)單一根元素的限制。
1.2 兩種語(yǔ)法形式
// 1. 顯式 Fragment 語(yǔ)法
import React, { Fragment } from 'react';
function ExampleWithFragment() {
return (
<Fragment>
<h1>Title</h1>
<p>Paragraph</p>
</Fragment>
);
}
// 2. 短語(yǔ)法(空標(biāo)簽)
function ExampleWithShortSyntax() {
return (
<>
<h1>Title</h1>
<p>Paragraph</p>
</>
);
}2. Fragment 和空標(biāo)簽的區(qū)別
2.1 key 屬性支持
// Fragment 可以接收 key 屬性
function ListItems({ items }) {
return (
<dl>
{items.map(item => (
<Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</Fragment>
))}
</dl>
);
}
// 空標(biāo)簽不支持任何屬性,包括 key
// 這樣會(huì)報(bào)錯(cuò)
function InvalidExample({ items }) {
return (
<dl>
{items.map(item => (
<key={item.id}> {/* 錯(cuò)誤!不支持屬性 */}
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</>
))}
</dl>
);
}2.2 語(yǔ)法支持
// Fragment 需要導(dǎo)入
import React, { Fragment } from 'react';
// 空標(biāo)簽不需要導(dǎo)入,直接使用
function NoImportNeeded() {
return (
<>
<div>Item 1</div>
<div>Item 2</div>
</>
);
}3. 使用場(chǎng)景
3.1 列表渲染
// 使用 Fragment 渲染列表(需要 key)
function List({ items }) {
return (
<ul>
{items.map(item => (
<Fragment key={item.id}>
<li>{item.name}</li>
<li>{item.description}</li>
</Fragment>
))}
</ul>
);
}
// 簡(jiǎn)單組合(使用空標(biāo)簽)
function SimpleComponent() {
return (
<>
<header />
<main />
<footer />
</>
);
}3.2 表格結(jié)構(gòu)
// 在表格中使用 Fragment
function TableRow({ data }) {
return (
<Fragment>
<td>{data.name}</td>
<td>{data.age}</td>
<td>{data.email}</td>
</Fragment>
);
}
function Table({ items }) {
return (
<table>
<tbody>
{items.map(item => (
<tr key={item.id}>
<TableRow data={item} />
</tr>
))}
</tbody>
</table>
);
}3.3 條件渲染
function ConditionalRender({ isLoggedIn }) {
return (
<>
<Header />
{isLoggedIn ? (
<>
<UserDashboard />
<UserSettings />
</>
) : (
<>
<LoginForm />
<RegisterLink />
</>
)}
<Footer />
</>
);
}4. 性能考慮
4.1 DOM 結(jié)構(gòu)
// 使用 Fragment 或空標(biāo)簽不會(huì)產(chǎn)生額外的 DOM 節(jié)點(diǎn)
function OptimizedStructure() {
return (
<>
<div>First</div>
<div>Second</div>
</>
);
}
// 渲染結(jié)果:
// <div>First</div>
// <div>Second</div>
// 而不是:
// <div>
// <div>First</div>
// <div>Second</div>
// </div>4.2 內(nèi)存使用
// Fragment 和空標(biāo)簽都不會(huì)創(chuàng)建額外的 DOM 節(jié)點(diǎn),因此內(nèi)存使用更少
function MemoryEfficient() {
return (
<>
{Array.from({ length: 1000 }).map((_, index) => (
<Fragment key={index}>
<span>Item</span>
<span>Description</span>
</Fragment>
))}
</>
);
}5. 最佳實(shí)踐
5.1 選擇建議
使用空標(biāo)簽(<>)</>) 當(dāng):
- 不需要傳遞 key 屬性
- 追求簡(jiǎn)潔的代碼
- 只需要簡(jiǎn)單的包裹功能
使用 Fragment 當(dāng):
- 需要使用 key 屬性(如在列表中)
- 需要明確的語(yǔ)義
- 在 TypeScript 中需要明確的類(lèi)型
5.2 代碼風(fēng)格
// 推薦:保持一致的縮進(jìn)
function GoodStyle() {
return (
<>
<div>Item 1</div>
<div>Item 2</div>
</>
);
}
// 不推薦:混亂的結(jié)構(gòu)
function BadStyle() {
return <>
<div>Item 1</div>
<div>Item 2</div>
</>;
}6. 常見(jiàn)問(wèn)題和解決方案
6.1 TypeScript 支持
// 在 TypeScript 中使用 Fragment
import React, { Fragment } from 'react';
interface Props {
items: Array<{ id: string; text: string }>;
}
function TypeScriptExample({ items }: Props) {
return (
<>
{items.map(item => (
<Fragment key={item.id}>
<div>{item.text}</div>
</Fragment>
))}
</>
);
}6.2 嵌套使用
// Fragment 可以嵌套使用
function NestedFragments() {
return (
<>
<div>Level 1</div>
<Fragment>
<div>Level 2.1</div>
<>
<div>Level 3.1</div>
<div>Level 3.2</div>
</>
<div>Level 2.2</div>
</Fragment>
</>
);
}7. 總結(jié)
7.1 使用場(chǎng)景對(duì)比
Fragment:
需要 key 屬性時(shí)在 TypeScript 中需要明確類(lèi)型需要語(yǔ)義化的代碼結(jié)構(gòu)
空標(biāo)簽:
簡(jiǎn)單的組件包裹不需要任何屬性追求簡(jiǎn)潔的代碼 7.2 最佳實(shí)踐建議 優(yōu)先使用空標(biāo)簽語(yǔ)法需要 key 時(shí)使用 Fragment保持代碼風(fēng)格一致注意性能優(yōu)化
到此這篇關(guān)于React Fragment 和空標(biāo)簽(<></>)用法詳細(xì)以及區(qū)別的文章就介紹到這了,更多相關(guān)React Fragment 空標(biāo)簽(<></>)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React實(shí)現(xiàn)Excel文件的導(dǎo)出與在線(xiàn)預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了如何利用?React?18?的強(qiáng)大功能,演示如何使用?React?18?編寫(xiě)?Excel?文件的導(dǎo)出與在線(xiàn)預(yù)覽功能,需要的小伙伴可以參考下2023-12-12
React 應(yīng)用中的 CSS 鍵盤(pán)記錄器攻擊問(wèn)題記錄
React應(yīng)用中CSS鍵盤(pán)記錄器攻擊利用CSS選擇器與受控組件機(jī)制竊取密碼,通過(guò)觸發(fā)字符對(duì)應(yīng)的background-image請(qǐng)求,防御需限制第三方CSS、采用非受控組件及CSP/SRI措施,本文介紹React 應(yīng)用中的 CSS 鍵盤(pán)記錄器攻擊問(wèn)題記錄,感興趣的朋友一起看看吧2025-07-07
解決React報(bào)錯(cuò)Property 'X' does not 
這篇文章主要為大家介紹了解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement',有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
React中setState同步異步場(chǎng)景的使用
本文主要介紹了React中setState同步異步場(chǎng)景的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
React中Hooks邏輯復(fù)用的實(shí)現(xiàn)
在React開(kāi)發(fā)中,Hooks的出現(xiàn)徹底改變了邏輯復(fù)用的方式,本文就來(lái)介紹一下Hooks邏輯復(fù)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
React Router 中實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由的示例
React Router 是一個(gè)非常強(qiáng)大和靈活的路由庫(kù),它為 React 應(yīng)用程序提供了豐富的導(dǎo)航和 URL 管理功能,能夠幫助我們構(gòu)建復(fù)雜的單頁(yè)應(yīng)用和多頁(yè)應(yīng)用,這篇文章主要介紹了React Router 中如何實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由,需要的朋友可以參考下2023-05-05
Input標(biāo)簽自動(dòng)校驗(yàn)功能去除實(shí)現(xiàn)
這篇文章主要為大家介紹了Input標(biāo)簽的自動(dòng)拼寫(xiě)檢查功能去除實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

