v19.2Latest

條件渲染

您的元件經常需要根據不同的條件顯示不同的內容。在 React 中,您可以使用 JavaScript 語法(例如if陳述式、&&? :運算子)來條件式地渲染 JSX。

您將學習
  • 如何根據條件返回不同的 JSX
  • 如何條件式地包含或排除一段 JSX
  • 您在 React 程式碼庫中會遇到的常見條件語法捷徑

條件式返回 JSX

假設您有一個 PackingList元件,它渲染了幾個Item,這些項目可以被標記為已打包或未打包:

請注意,有些 Item 元件的 isPacked屬性被設定為true 而不是 false。如果 isPacked={true},您希望在已打包的項目旁加上勾選標記 (✅)。

您可以將其寫成一個if/else 陳述式,如下所示:

如果 isPacked屬性為true,此程式碼會返回一個不同的 JSX 樹狀結構。經過此更改後,部分項目末尾會出現勾選標記:

試著編輯任一種情況下返回的內容,看看結果如何變化!

請注意,您正在使用 JavaScript 的ifreturn語句來建立分支邏輯。在 React 中,控制流程(例如條件判斷)是由 JavaScript 處理的。

使用 null 有條件地不返回任何內容

在某些情況下,您可能完全不想渲染任何內容。例如,假設您根本不想顯示已打包的物品。元件必須返回某些內容。在這種情況下,您可以返回null

如果isPacked為真,元件將不返回任何內容,即null。否則,它將返回要渲染的 JSX。

實際上,從元件返回null並不常見,因為這可能會讓嘗試渲染它的開發人員感到意外。更常見的做法是,您會在父元件的 JSX 中有條件地包含或排除該元件。以下是具體做法!

有條件地包含 JSX

在前面的例子中,您控制了元件將返回哪個(如果有的話!)JSX 樹。您可能已經注意到渲染輸出中存在一些重複:

與以下內容非常相似

這兩個條件分支都返回 <li className="item">...</li>

雖然這種重複沒有害處,但可能會讓你的程式碼更難維護。如果你想更改 className怎麼辦?你必須在程式碼的兩個地方進行修改!在這種情況下,你可以有條件地包含一點 JSX,讓你的程式碼更加DRY(不要重複自己)。

條件(三元)運算子 (? :)

JavaScript 有一種緊湊的語法來編寫條件表達式——條件運算子或「三元運算子」。

與其這樣寫:

你可以這樣寫:

你可以將其讀作「如果isPacked為真,則 (?) 渲染name + ' ✅',否則 (:) 渲染name

Deep Dive
這兩個例子完全等價嗎?

現在假設你想將已完成項目的文字包裝到另一個 HTML 標籤中,例如<del>以將其劃掉。你可以添加更多換行和括號,以便更容易在每種情況下嵌套更多 JSX:

這種風格適用於簡單的條件,但要適度使用。如果你的元件因為嵌套了太多條件標記而變得混亂,請考慮提取子元件來清理。在 React 中,標記是你程式碼的一部分,因此你可以使用變數和函數等工具來整理複雜的表達式。

邏輯 AND 運算子 (&&)

另一個你會遇到的常見捷徑是 JavaScript 邏輯 AND (&&) 運算子。在 React 元件內部,當你希望在條件為真時渲染一些 JSX,否則不渲染任何內容時,它經常出現。使用&&,你可以僅在 isPackedtrue時有條件地渲染勾選標記:

你可以將其讀作「如果isPacked,則 (&&) 渲染勾選標記,否則,不渲染任何內容」

以下是實際運作情況:

一個JavaScript && 表達式會在左側(我們的條件)為 true時返回右側的值(在我們的例子中是勾選標記)。但如果條件為false,整個表達式就變成 false。React 將false視為 JSX 樹中的一個「空洞」,就像nullundefined一樣,並且不會在其位置渲染任何內容。

陷阱

不要在 &&的左側放置數字。

為了測試條件,JavaScript 會自動將左側轉換為布林值。然而,如果左側是0,那麼整個表達式就會得到該值 (0),而 React 會樂於渲染0而不是什麼都不渲染。

例如,一個常見的錯誤是編寫像 messageCount && <p>New messages</p> 這樣的程式碼。很容易假設當 messageCount0時它不會渲染任何內容,但它實際上渲染的是0本身!

要修復它,請將左側設為布林值:messageCount > 0 && <p>New messages</p>

有條件地將 JSX 賦值給變數

當捷徑妨礙編寫清晰的程式碼時,請嘗試使用 if 陳述式和變數。你可以重新賦值使用 let定義的變數,所以先提供你想要顯示的預設內容,即名稱:

使用 if 陳述式,在 isPackedtrue時,將一個 JSX 表達式重新賦值給itemContent

大括號開啟了「通往 JavaScript 世界的窗口」。 在大括號中嵌入變數,將先前計算的表達式嵌套在返回的 JSX 樹中:

這種風格最為冗長,但也最為靈活。以下是實際運作範例:

與之前一樣,這不僅適用於文字,也適用於任意的 JSX:

如果您不熟悉 JavaScript,一開始可能會覺得這些多樣化的風格令人不知所措。然而,學習它們將幫助您閱讀和編寫任何 JavaScript 程式碼——而不僅僅是 React 元件!首先選擇您偏好的風格,然後如果您忘記其他風格如何運作,可以再次查閱此參考資料。

回顧

  • 在 React 中,您使用 JavaScript 來控制分支邏輯。
  • 您可以使用 if陳述式有條件地返回一個 JSX 表達式。
  • 您可以有條件地將一些 JSX 儲存到變數中,然後透過使用大括號將其包含在其他 JSX 中。
  • 在 JSX 中,{cond ? <A /> : <B />} 表示 「如果cond為真,則渲染<A />,否則渲染<B />
  • 在 JSX 中,{cond && <A />} 表示 「如果cond為真,則渲染<A />,否則不渲染任何內容」
  • 這些快捷方式很常見,但如果您偏好使用單純的 if,則不必使用它們。

嘗試一些挑戰

Challenge 1 of 3:使用 ? : 為未完成項目顯示圖示#

使用條件運算子 (cond ? a : b) 來渲染 ❌,如果 isPacked 不是 true