Skip to main content

React - JSX 語法

JSX 是什麼?

JSX 全名是 JavaScript XML,是一種 JavaScript 語法的擴展,它可以讓我們在 JavaScript 中撰寫像 HTML 一樣的語法,比如下面這行程式碼:

<h1>Hello world</h1>

可以看到跟 HTML 無任何差異,但是這是在 JavaScript 中撰寫的程式碼。至還可以把使用 JSX 語法撰寫出的元件儲存在變數、物件或陣列之中:

// Storage in a variable
const navBar = <nav>I am a nav bar</nav>;

// Storage in an object
const myTeam = {
center: <li>Benzo Walli</li>,
powerForward: <li>Rasha Loa</li>,
smallForward: <li>Tayshaun Dasmoto</li>,
shootingGuard: <li>Colmar Cumberbatch</li>,
pointGuard: <li>Femi Billon</li>
}

渲染 JSX 內容

// Import React and createRoot first
import React from "react";
import { createRoot } from "react-dom/client";

// Render a JSX expression
const container = document.getElementById("container")
const root = createRoot(container)
root.render(<h1>Hello world</h1>)

在 JSX 中撰寫 JavaScript

在 JSX 語法中,如果要引用變數或是要撰寫JavaScrip ,必須用 框起來:

const name = ‘Jeremy’
root.render(<h1>{name}</h1>)

root.render(<h1>The sum is: {2+3}</h1>)

在 JSX 中撰寫條件式

不幸的是,我們在 JSX 中並不能撰寫我們最熟悉的 if-else 條件式,我們只能用 if-else 包住 JSX 語法,但不能在JSX 語法中包 if-else 條件式,因此得改用 Ternary operator&&

Ternary operator
const headline = (
<h1>
{ age >= drinkingAge ? 'Buy Drink' : 'Do Nothing' }
</h1>
)
&&
const tasty = (
<ul>
<li>Applesauce</li>
{ age > 15 && <li>Brussels Sprouts</li> }
{ age > 20 && <li>Oysters</li> }
{ age > 25 && <li>Grappa</li> }
</ul>
)
root.render(tasty)

在 JSX 中撰寫迴圈

在 JSX 中撰寫迴圈,我們可以使用 map 方法。

const strings = ['Home', 'Shop', 'About Me']
const listItems = strings.map(string => <li>{string}</li>)

<ul>{listItems}</ul>

嚴謹一點來說,在 JSX 中寫迴圈會一併傳入 key 屬性,這是為了讓 React 更有效率的處理元件的更新,這個 key 屬性必須是唯一的,通常會使用資料的 id

<ul>
<li key="li-01">Example1</li>
<li key="li-02">Example2</li>
<li key="li-03">Example3</li>
</ul>

JSX 與事件監聽

在 JSX 中撰寫事件監聽,我們可以使用 on 關鍵字,後面接著事件名稱,並且指定一個函式。

function clickAlert() {
alert('You clicked this image!');
}

<img onClick={clickAlert} />