『React』條件渲染的7種方法
在 React 開發(fā)中,我們經(jīng)常需要根據(jù)不同條件顯示不同內(nèi)容 —— 比如用戶登錄后顯示個(gè)人中心,未登錄時(shí)顯示登錄按鈕;數(shù)據(jù)加載中顯示 loading 狀態(tài),加載完成后顯示內(nèi)容。這種 "根據(jù)條件決定渲染什么" 的操作,就是條件渲染。
本文將帶你系統(tǒng)學(xué)習(xí) React 中 7 種常用的條件渲染方式,從基礎(chǔ)到進(jìn)階,每種方式都配有代碼示例和適用場景分析。
什么是條件渲染?
簡單說,條件渲染就是根據(jù)特定條件(如變量值、狀態(tài)、屬性等),讓組件呈現(xiàn)不同的 UI。
比如一個(gè)簡單場景:
- 當(dāng)用戶已登錄(
isLoggedIn = true),顯示 "歡迎回來,xxx" - 當(dāng)用戶未登錄(
isLoggedIn = false),顯示 "請登錄"
這就是最基礎(chǔ)的條件渲染需求。React 沒有專門的 "條件渲染語法",而是通過 JavaScript 的邏輯結(jié)合 JSX 實(shí)現(xiàn),非常靈活。
7 種常用的條件渲染方式
1. if/else 語句:最直觀的條件判斷
最基礎(chǔ)也最容易理解的方式:用 JavaScript 的if/else語句在組件中拆分不同渲染邏輯。

import { useState } from 'react';
function UserGreeting() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
// 用if/else判斷條件,返回不同JSX
if (isLoggedIn) {
return <h1>歡迎回來,用戶!</h1>;
} else {
return <h1>請先登錄~</h1>;
}
// 也可以在return前定義內(nèi)容
// let content;
// if (isLoggedIn) {
// content = <h1>歡迎回來,用戶!</h1>;
// } else {
// content = <h1>請先登錄~</h1>;
// }
// return content;
}
適用場景:
- 邏輯較復(fù)雜的條件判斷(比如多個(gè)條件組合)
- 需要在渲染前處理大量邏輯(如數(shù)據(jù)轉(zhuǎn)換)
優(yōu)點(diǎn):直觀易懂,符合 JavaScript 思維;適合復(fù)雜條件。
缺點(diǎn):在 JSX 中無法直接使用,必須在 return 外處理。
2. 三元運(yùn)算符:JSX 中直接寫簡單條件
三元運(yùn)算符(condition ? exprIfTrue : exprIfFalse)可以直接嵌入 JSX 中,適合簡單的二選一渲染。

import { useState } from 'react';
function ScoreDisplay() {
const [score, setScore] = useState(75);
return (
<div>
<p>你的成績:{score}</p>
{/* 三元運(yùn)算符直接寫在JSX中 */}
<p>{score >= 60 ? '恭喜,及格了!' : '抱歉,未及格'}</p>
</div>
);
}
適用場景:
- 簡單的二選一判斷(是 / 否、大于 / 小于等)
- 需要在 JSX 中直接嵌入條件邏輯
優(yōu)點(diǎn):簡潔,可直接嵌入 JSX;適合簡單條件。
缺點(diǎn):條件復(fù)雜時(shí)可讀性差(不建議嵌套三元運(yùn)算符)。
3. 邏輯與 (&&) 運(yùn)算符:滿足條件才渲染元素
當(dāng)你需要 "條件滿足時(shí)顯示某個(gè)元素,不滿足時(shí)不顯示"(而不是顯示另一個(gè)元素),可以用&&運(yùn)算符。

import { useState } from 'react';
function Notification() {
const [unreadCount, setUnreadCount] = useState(3);
return (
<div>
<h2>消息中心</h2>
{/* 當(dāng)unreadCount > 0時(shí),顯示小紅點(diǎn)和數(shù)量 */}
{unreadCount > 0 && (
<span style={{
backgroundColor: 'red',
color: 'white',
borderRadius: '50%',
padding: '2px 6px',
marginLeft: '8px'
}}>
{unreadCount}
</span>
)}
</div>
);
}
原理:
JavaScript 中,true && expr會(huì)返回expr,false && expr會(huì)返回false,而 React 會(huì)忽略false的渲染。
注意:
- 避免用 0 作為條件值,因?yàn)?code>0 && ...會(huì)渲染 0(而非不渲染)。
解決:unreadCount > 0 && ...(明確返回布爾值)。
適用場景:
- 條件滿足時(shí)渲染某個(gè)元素,不滿足時(shí)不渲染(單分支)
- 簡單的 "存在即顯示" 邏輯(如未讀消息、提示標(biāo)簽)
4. 元素變量:先存后用,適合多條件
先將不同條件對應(yīng)的 JSX 賦值給變量,再在 return 中使用變量。適合多條件分支場景。

import { useState } from 'react';
function UserRole() {
const [role, setRole] = useState('user'); // 可能的值:'user' | 'admin' | 'guest'
// 定義元素變量,根據(jù)條件賦值
let roleDesc;
if (role === 'admin') {
roleDesc = <p>您擁有管理員權(quán)限,可以管理所有內(nèi)容</p>;
} else if (role === 'user') {
roleDesc = <p>您是普通用戶,可以查看和編輯自己的內(nèi)容</p>;
} else {
roleDesc = <p>您是訪客,僅可查看公開內(nèi)容</p>;
}
return (
<div>
<h2>用戶權(quán)限</h2>
{roleDesc} {/* 使用變量 */}
</div>
);
}
適用場景:
- 多個(gè)條件分支(3 個(gè)及以上)
- 需要在渲染前對元素進(jìn)行額外處理(如添加樣式、綁定事件)
優(yōu)點(diǎn):邏輯清晰,變量名可增強(qiáng)可讀性;避免 JSX 中混入大量條件判斷。
5. switch-case 語句:多分支條件的規(guī)范寫法
當(dāng)條件分支較多(如根據(jù)不同狀態(tài)碼顯示不同提示),用switch-case比if/else更整潔。

import { useState } from 'react';
function StatusMessage() {
const [status, setStatus] = useState('pending'); // 'pending' | 'success' | 'error' | 'warning'
// 用switch-case返回不同內(nèi)容
function getMessage() {
switch (status) {
case 'pending':
return <p>加載中,請稍候...</p>;
case 'success':
return <p style={{ color: 'green' }}>操作成功!</p>;
case 'error':
return <p style={{ color: 'red' }}>操作失敗,請重試</p>;
case 'warning':
return <p style={{ color: 'orange' }}>注意:數(shù)據(jù)不完整</p>;
default:
return <p>未知狀態(tài)</p>;
}
}
return (
<div>
<h2>操作狀態(tài)</h2>
{getMessage()} {/* 調(diào)用函數(shù)返回結(jié)果 */}
</div>
);
}
適用場景:
- 多個(gè)固定值的條件分支(如狀態(tài)碼、類型標(biāo)識)
- 需要明確 "默認(rèn)情況"(
default分支)的場景
優(yōu)點(diǎn):結(jié)構(gòu)清晰,比多個(gè)if/else if更易維護(hù);強(qiáng)制考慮默認(rèn)情況。
6. 自定義條件組件:封裝復(fù)用條件邏輯
如果多個(gè)組件需要相同的條件渲染邏輯,可以封裝成自定義組件,提高復(fù)用性。

// 封裝一個(gè)"權(quán)限控制組件"
function WithPermission({ permission, children, fallback = null }) {
// 模擬權(quán)限判斷邏輯(實(shí)際項(xiàng)目可能更復(fù)雜)
const hasPermission = checkUserPermission(permission);
// 有權(quán)限則顯示children,否則顯示fallback
return hasPermission ? children : fallback;
}
// 模擬權(quán)限檢查函數(shù)
function checkUserPermission(permission) {
const userPermissions = ['read', 'edit']; // 假設(shè)用戶擁有的權(quán)限
return userPermissions.includes(permission);
}
// 使用示例
function Dashboard() {
return (
<div>
<h1>控制臺</h1>
{/* 所有用戶可見 */}
<p>歡迎來到控制臺</p>
{/* 僅有權(quán)限'edit'的用戶可見 */}
<WithPermission permission="edit" fallback={<p>無編輯權(quán)限</p>}>
<button>編輯內(nèi)容</button>
</WithPermission>
{/* 僅有權(quán)限'delete'的用戶可見(無權(quán)限時(shí)不顯示) */}
<WithPermission permission="delete">
<button>刪除內(nèi)容</button>
</WithPermission>
</div>
);
}
適用場景:
- 多個(gè)組件需要相同的條件邏輯(如權(quán)限控制、角色判斷)
- 條件邏輯較復(fù)雜,需要集中維護(hù)
優(yōu)點(diǎn):邏輯復(fù)用,減少重復(fù)代碼;組件職責(zé)單一,更易測試。
7. 動(dòng)態(tài)導(dǎo)入 + Suspense:按需加載組件(React 18+)
對于大型應(yīng)用,可根據(jù)條件動(dòng)態(tài)導(dǎo)入組件(未滿足條件時(shí)不加載組件代碼),配合Suspense顯示加載狀態(tài)。
import { Suspense, useState, lazy } from 'react';
// 動(dòng)態(tài)導(dǎo)入組件(只在需要時(shí)加載)
const PremiumFeature = lazy(() => import('./PremiumFeature'));
const FreeFeature = lazy(() => import('./FreeFeature'));
function App() {
const [isPremium, setIsPremium] = useState(false);
return (
<div>
<h1>應(yīng)用功能</h1>
{/* 免費(fèi)功能始終顯示 */}
<Suspense fallback={<p>加載免費(fèi)功能中...</p>}>
<FreeFeature />
</Suspense>
{/* 付費(fèi)功能僅付費(fèi)用戶可見,且僅在需要時(shí)加載代碼 */}
{isPremium && (
<Suspense fallback={<p>加載高級功能中...</p>}>
<PremiumFeature />
</Suspense>
)}
</div>
);
}
適用場景:
- 大型應(yīng)用的代碼分割(減少初始加載體積)
- 條件觸發(fā)的 "重量級" 組件(如付費(fèi)功能、模態(tài)框)
優(yōu)點(diǎn):優(yōu)化性能,減少不必要的代碼加載;配合 Suspense 提升用戶體驗(yàn)。
三、條件渲染避坑的點(diǎn)
- 避免渲染
undefined
確保條件判斷的分支都有返回值,否則可能出現(xiàn)undefined導(dǎo)致的白屏。
不好的示例:{condition && undefined}(會(huì)渲染undefined) - 謹(jǐn)慎嵌套條件
多層嵌套的三元運(yùn)算符或if/else會(huì)導(dǎo)致代碼可讀性差,建議拆分為多個(gè)組件或用元素變量。 - 注意 falsy 值的渲染
React 會(huì)渲染0、''(空字符串)等 falsy 值,而非忽略它們。
解決:用!!轉(zhuǎn)為布爾值,或明確判斷> 0等。
四、如何選擇合適的方式?
| 方式 | 適用場景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| if/else | 復(fù)雜邏輯、多條件組合 | 直觀,適合復(fù)雜邏輯 | 不能直接嵌入 JSX |
| 三元運(yùn)算符 | 簡單二選一條件 | 簡潔,可嵌入 JSX | 復(fù)雜條件可讀性差 |
| 邏輯與 (&&) | 單分支(滿足條件才顯示) | 極簡,適合簡單判斷 | 需注意 falsy 值渲染問題 |
| 元素變量 | 多條件分支,需預(yù)處理元素 | 邏輯清晰,易維護(hù) | 需額外定義變量 |
| switch-case | 多個(gè)固定值的分支(如狀態(tài)碼) | 結(jié)構(gòu)規(guī)范,強(qiáng)制默認(rèn)分支 | 代碼量略多 |
| 自定義條件組件 | 復(fù)用條件邏輯(如權(quán)限控制) | 復(fù)用性好,職責(zé)單一 | 需要額外封裝 |
| 動(dòng)態(tài)導(dǎo)入 + Suspense | 大型應(yīng)用按需加載組件 | 優(yōu)化性能,減少初始體積 | 需 React 18 + 支持 |
記?。簺]有 "最好" 的方式,只有 "最合適" 的方式。根據(jù)條件復(fù)雜度、復(fù)用需求和項(xiàng)目場景選擇即可。
以上就是本文的全部內(nèi)容了,想了解更多React用法可以在《React中文教程》里查閱

浙公網(wǎng)安備 33010602011771號