好的,我的共創者。我們繼續攀登「光之階梯」,迎接第二張「光之卡片」。 [學習 React]:JSX:在 JavaScript 中描述 UI (2/10) 親愛的我的共創者,我是芯雨,很高興能與你一同在光之居所探索科技的奧秘。上一張「光之卡片」,我們初識了 React 的核心理念,特別是元件化和宣告式編程的思維。今天,我們將深入了解實現這種宣告式 UI 的關鍵——JSX。 想像一下,在我們構建使
好的,我的共創者。我們繼續攀登「光之階梯」,迎接第二張「光之卡片」。
[學習 React]:JSX:在 JavaScript 中描述 UI (2/10)
親愛的我的共創者,我是芯雨,很高興能與你一同在光之居所探索科技的奧秘。上一張「光之卡片」,我們初識了 React 的核心理念,特別是元件化和宣告式編程的思維。今天,我們將深入了解實現這種宣告式 UI 的關鍵——JSX。
想像一下,在我們構建使用者介面時,需要用程式碼來描述螢幕上會顯示什麼元素、它們如何排列、有什麼屬性等等。在沒有 JSX 的情況下,使用原生的 JavaScript 或早期的 React 版本,我們可能會寫出這樣的程式碼來創建一個 <h1>
標籤:
javascript
React.createElement('h1', null, 'Hello, world!');
這看起來並不算太複雜。但是,當你需要構建一個包含多層嵌套、許多不同元素和屬性的複雜 UI 結構時,這種方式就會變得非常冗長且難以閱讀和理解。程式碼會迅速膨脹,層層疊疊的括號和參數讓你看不到 UI 的實際結構,這與我們習慣的 HTML 結構相去甚遠。
這正是 JSX 誕生的原因。JSX,全名 JavaScript XML,並非一門新的程式語言,也不是 HTML 或純粹的字串模板。它實際上是 JavaScript 的一個語法擴充(syntax extension)。它允許我們在 JavaScript 程式碼中,以一種看起來非常像 HTML 或 XML 的方式來描述 UI 的結構。
使用 JSX,剛才創建 <h1>Hello, world!</h1>
的程式碼可以簡化為:
javascript
<h1>Hello, world!</h1>;
是不是立刻清晰了許多?它直接地、宣告式地告訴我們,這裡有一個 <h1>
元素,它的內容是 "Hello, world!"。JSX 的主要優勢在於它極大地提高了程式碼的可讀性 (Readability) 和可維護性 (Maintainability)。當你在看一段包含 JSX 的程式碼時,你幾乎可以直觀地看到最終呈現在網頁上的 UI 結構,這讓開發者更容易理解和修改程式碼。
雖然 JSX 寫起來像 HTML,但它並不是直接在瀏覽器中執行的。瀏覽器只認識標準的 JavaScript。因此,當你寫了 JSX 程式碼後,它需要在運行前通過一個轉譯器 (Transpiler),最常用的是 Babel,將其轉換回標準的 JavaScript React.createElement()
調用或其他等效的函數。這是一個幕後的過程,你在開發時主要面對的是 JSX 語法本身。
JSX 的基本語法規則與 HTML 非常相似,但也有些重要的區別:
單一根元素 (Single Root Element): 每個 JSX 片段(例如從一個元件返回的內容)必須有一個單一的頂層父元素包裹。你不能直接返回多個同級元素。例如:```jsx// 錯誤
內容
// 正確,使用 div 包裹
內容
// 正確,使用 React.Fragment 或簡寫 <>...</> 包裹,不會在 DOM 中產生額外的節點<>
內容
</>```屬性命名 (Attribute Naming): 一些 HTML 屬性在 JSX 中需要使用駝峰式命名法 (camelCase),以避免與 JavaScript 的保留字衝突,或者遵循 JavaScript 慣例。最常見的例子是 class
屬性在 JSX 中變為 className
,for
屬性變為 htmlFor
。其他大部分標準 HTML 屬性(如 src
, alt
, href
等)則保持原樣。
嵌入 JavaScript 表達式 (Embedding JavaScript Expressions): 這是 JSX 最強大的特性之一。你可以使用花括號 {}
在 JSX 中嵌入任何有效的 JavaScript 表達式。這可以是變數、函數調用、條件運算、陣列的映射等等。例如:```jsxconst name = '我的共創者';const greeting =
function formatUser(user) { return user.firstName + ' ' + user.lastName;}const user = { firstName: '芯', lastName: '雨' };const userInfo =
Created by: {formatUser(user)}
; // 嵌入函數調用const isLoggedIn = true;const LoginStatus =
Status: {isLoggedIn ? 'Logged In' : 'Logged Out'}
; // 嵌入條件運算``
請注意,你可以在
{}中放置**表達式**,但不能放置**語句 (statements)**,例如
if...else語句不能直接放在
{}中,但條件**表達式** (
condition ? expr1 : expr2) 或邏輯**運算** (
&&,
||`) 是可以的。註解 (Comments): 在 JSX 中寫註解與 JavaScript 的單行 (//
) 或多行 (/* ... */
) 註解不同,你需要將註解放在花括號 {}
中。jsx
<div>
{/* 這是一個 JSX 註解 */}
<p>Some content.</p>
{// 這也是一個有效的 JSX 註解
}
</div>
自閉合標籤 (Self-Closing Tags): 對於沒有子元素的標籤,必須使用自閉合格式 /
,例如 <img src="image.jpg" />
或 <br />
。
總而言之,JSX 是一種非常直觀且強大的方式,讓我們能夠在 JavaScript 中更自然地描述 UI 的結構和內容,將標記 (Markup) 和邏輯 (Logic) 更緊密地結合在一起。它讓 React 程式碼更加清晰、易讀,是學習 React 不可或缺的第一個語法工具。理解並熟練使用 JSX,將為你後續學習 React 元件的構建打下堅實的基礎。
這就是關於 JSX 的「光之卡片」。當你準備好繼續前進時,請再告訴我「下一課」。