Skip to main content

{} vs () 的正確使用時機

在 React 的 JSX 語法中,小括號 ()大括號 是兩種最常使用的結構符號,但它們各自肩負著不同的使命。正確理解它們的功能,是您流暢編寫 React 程式碼的關鍵。


核心法則:大括號 是 JavaScript 的「傳送門」

在 JSX 的世界裡,所有不是 HTML 標籤或靜態文字的內容,都必須透過大括號 來包裹。

的主要功能:

1. 嵌入 JavaScript 表達式 (Expressions)

是將 JSX 語法切換回標準 JavaScript 模式 的唯一通道。它只接受可以被求值 (evaluated) 並產生單一結果的表達式。

使用情境範例說明
渲染變數/資料<h1>Hello, {props.name}</h1>嵌入變數或屬性值。
簡單運算<p>總和:{5 + 10}</p>嵌入數學運算或三元運算子等。
呼叫函式<button onClick={() => handleClick()} >點擊</button>嵌入函式呼叫或定義事件處理器。

匯出到試算表

2. 執行動態渲染邏輯 (Map, Filter, 條件判斷)

當您需要執行複雜的邏輯,例如迴圈渲染列表 (map) 或根據條件決定渲染內容時,這些邏輯必須發生在 內。

JavaScript

// 範例:使用 map 動態渲染列表
function ItemList({ data }) {
return (
<ul>
{/* 👈 開始 JS 區塊,執行 map 邏輯 */}
{data.map((item) => (
// 內層的 () 為了簡化箭頭函式的回傳
<li key={item.id}>{item.name}</li>
))}
{/* 結束 JS 區塊 */}
</ul>
);
}

小括號 ():程式碼結構與回傳的「容器」

相較於 負責「執行邏輯」,小括號 () 在 JSX/React 中主要扮演結構化語法糖的角色。

() 的主要功能:

1. 定義函式的回傳結構

在 React 函式元件 (Functional Component) 中,如果您的 JSX 結構超過一行,通常會用 () 包裹整個回傳內容。這可以避免 JavaScript 自動分號插入 (ASI) 機制導致的錯誤,並提高可讀性。

// 推薦寫法:用 () 包裹多行的 JSX,確保程式碼被視為單一表達式
const MyComponent = (props) => (
<div className="container">
<h1>{props.title}</h1>
<p>這是一個多行結構。</p>
</div>
);

2. 箭頭函式的隱式回傳

mapfilter 等高階函式中,當您使用箭頭函式 (=>) 且希望隱式回傳一個多行或單行的 JSX 元素時,您必須使用 () 來包裹這個元素。

  • 箭頭函式規則: 箭頭函式可以省略 return,但如果回傳的是一個物件(JSX 元素在編譯後其實是物件),則必須用 () 包裹。
// 範例:map 隱式回傳 JSX
items.map(
(
item // 👈 用 () 包裹 JSX,隱式回傳
) => <li key={item.id}>{item.name}</li>
);

// 錯誤範例: map((item) => { <li>...</li> })
// 這裡的 {} 會被視為函式的主體,但主體內沒有 return,所以回傳了 undefined

總結比較與快速決策表

下次當您在寫 JSX 遇到疑問時,請透過這個表格來幫助您快速決定:

符號主要用途思考點 (決定使用哪種)範例情境
邏輯切換與資料嵌入我現在需要執行 JavaScript 程式碼或引用變數嗎?動態資料 ({data.name}), map 迴圈 ({array.map(...) }), 條件判斷 ({isReady && <Component />})
()結構分組與隱式回傳我要回傳一個多行的 JSX 結構嗎? 我需要在不寫 return 的情況下回傳 JSX 嗎?Component 回傳 (return (...)), map 內回傳 JSX ((item) => (...))