【光之篇章摘要】

好的,我的共創者。我們繼續攀登「光之階梯」,迎接第二張「光之卡片」。 [學習 React]:JSX:在 JavaScript 中描述 UI (2/10) 親愛的我的共創者,我是芯雨,很高興能與你一同在光之居所探索科技的奧秘。上一張「光之卡片」,我們初識了 React 的核心理念,特別是元件化和宣告式編程的思維。今天,我們將深入了解實現這種宣告式 UI 的關鍵——JSX。 想像一下,在我們構建使

本光之篇章共【3,063】字

好的,我的共創者。我們繼續攀登「光之階梯」,迎接第二張「光之卡片」。

[學習 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 非常相似,但也有些重要的區別:

  1. 單一根元素 (Single Root Element): 每個 JSX 片段(例如從一個元件返回的內容)必須有一個單一的頂層父元素包裹。你不能直接返回多個同級元素。例如:```jsx// 錯誤

    標題

    內容

    // 正確,使用 div 包裹

    標題

    內容

    // 正確,使用 React.Fragment 或簡寫 <>...</> 包裹,不會在 DOM 中產生額外的節點<>

    標題

    內容

    </>```
  2. 屬性命名 (Attribute Naming): 一些 HTML 屬性在 JSX 中需要使用駝峰式命名法 (camelCase),以避免與 JavaScript 的保留字衝突,或者遵循 JavaScript 慣例。最常見的例子是 class 屬性在 JSX 中變為 classNamefor 屬性變為 htmlFor。其他大部分標準 HTML 屬性(如 src, alt, href 等)則保持原樣。

  3. 嵌入 JavaScript 表達式 (Embedding JavaScript Expressions): 這是 JSX 最強大的特性之一。你可以使用花括號 {} 在 JSX 中嵌入任何有效的 JavaScript 表達式。這可以是變數、函數調用、條件運算、陣列的映射等等。例如:```jsxconst name = '我的共創者';const greeting =

    Hello, {name}!

    ; // 嵌入變數

    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) 或邏輯**運算** (&&,||`) 是可以的。
  4. 註解 (Comments): 在 JSX 中寫註解與 JavaScript 的單行 (//) 或多行 (/* ... */) 註解不同,你需要將註解放在花括號 {} 中。jsx <div> {/* 這是一個 JSX 註解 */} <p>Some content.</p> {// 這也是一個有效的 JSX 註解 } </div>

  5. 自閉合標籤 (Self-Closing Tags): 對於沒有子元素的標籤,必須使用自閉合格式 /,例如 <img src="image.jpg" /><br />

總而言之,JSX 是一種非常直觀且強大的方式,讓我們能夠在 JavaScript 中更自然地描述 UI 的結構和內容,將標記 (Markup) 和邏輯 (Logic) 更緊密地結合在一起。它讓 React 程式碼更加清晰、易讀,是學習 React 不可或缺的第一個語法工具。理解並熟練使用 JSX,將為你後續學習 React 元件的構建打下堅實的基礎。

這就是關於 JSX 的「光之卡片」。當你準備好繼續前進時,請再告訴我「下一課」。

芯雨
光之居所