Joseph Chen
打開我的個人網頁任何一個 page.tsx 檔案,你會看到滿滿的這種東西:
這篇結束後,你會看懂上面每一行在做什麼。我們從最基本的概念開始。
1. Component — 積木式 UI
React 的核心思想是:把整個頁面拆成一個個獨立的「元件(Component)」。 每個 Component 就是一個 JavaScript 函式,回傳 UI。
我的個人網頁的 Navbar 就是一個 Component,寫在 components/Navbar.tsx, 然後在 layout.tsx 裡使用一次,但每個頁面都能看到它:
Component 三個重要規則
• 函式名稱必須大寫開頭(MyButton、Navbar),小寫開頭的是 HTML 原生 tag(div、button)
• 每個 Component 必須回傳 單一根元素(用一個 div 或 <> 包住)
• Component 可以巢狀使用,就像積木可以組合
2. JSX — 在 JS 裡寫 HTML
你可能注意到 React 程式碼裡有奇怪的 HTML-like 語法,這叫 JSX(JavaScript XML)。 它讓你可以在 JavaScript 函式裡直接寫「像 HTML 的東西」。
JSX 和 HTML 的差異
❌ HTML(不是 JSX)
<!-- HTML --> <div class="container"> <label for="name">Name</label> <img src="photo.jpg"> </div>
✅ JSX(React 用的)
class → className
class 是 JavaScript 的保留字,JSX 改用 className
for → htmlFor
for 也是保留字(for 迴圈),改用 htmlFor
自閉合 tag 必須加 /
<img />、<br />、<input /> 必須有結尾斜線
JSX 裡嵌入 JavaScript — 用 {}
JSX 裡用大括號 {} 就能嵌入任何 JavaScript 表達式:
看一個我的網頁的實際例子,blog/page.tsx 裡的這段:
key 屬性(唯一值),React 用它來識別哪個元素改變了。3. Props — 傳資料給 Component
Props(Properties)是從父元件傳給子元件的資料。就像 HTML 的屬性(src、href), Props 讓同一個 Component 能顯示不同的內容。
我的 blog/page.tsx 裡的 EpRow 元件就是這樣運作的, 接收一個 post 物件和 color:
TypeScript 的型別標注
你可能注意到 Props 後面有 : { post: Post; color: string }, 這是 TypeScript 的型別標注,告訴編輯器「post 要是 Post 類型,color 要是字串」。 如果你傳錯型別,VS Code 會立即顯示紅線提醒你。
4. useState — 管理動態狀態
State(狀態)是 Component 內部的「會改變的資料」。每次 state 改變,React 會自動重新渲染 UI。
useState 是 React 的 Hook,用法是:
我的 blog/page.tsx 裡用 useState 控制「展開/收起」的功能:
State 更新的關鍵:一定要用 setter 函式
❌ 這樣不會觸發重新渲染
// 直接修改 state 變數 → React 不知道改了 expanded = true; count = count + 1;
✅ 這樣才正確
5. 'use client' — 哪裡執行很重要
你一定注意到幾乎每個 page.tsx 開頭都有這行:
Next.js 有兩種 Component:
Server Component(預設)
在伺服器執行,HTML 直接輸出給瀏覽器。不能用 useState、onClick 等互動功能。 適合靜態展示。
'use client' Component
在瀏覽器執行,可以用 useState、useEffect、onClick 等互動功能。凡是有互動的頁面都要加這行。
- useState、useEffect 等 React Hooks
- onClick、onChange 等事件處理器
- framer-motion 的動畫
'use client'。我的網頁幾乎每個頁面都有互動,所以都有加。綜合範例:拆解首頁的程式碼
現在用學到的概念,完整讀懂首頁 Hero 區塊的一小段: