跳至內容
返回

React 入門(1):環境建置、JSX 與第一個 Component

發佈於:  at  08:00 上午

前言

這是我學習 React 的第一篇筆記。React 是主流的前端函式庫之一,核心概念是「用 Component(元件)組合出整個畫面」。這篇文章會從零開始,帶你:

  1. 安裝 Node.js 並用 Vite 建立專案
  2. 理解 JSX 語法與 Component 概念
  3. 親手寫出第一個 Greeting 元件
  4. 進一步寫出會接收資料的 UserCard 元件

安裝 Node.js + 建立 Vite 專案

安裝 Node.js

React 的開發工具都跑在 Node.js 上,所以第一步是安裝它。前往 nodejs.org 下載 LTS(長期支援) 版本即可。

安裝完成後,打開終端機確認是否安裝成功:

node -v
npm -v

只要兩個指令都印出版本號(例如 v20.x.x),就代表安裝完成了。node 是執行環境,npm 則是套件管理工具,等一下會用它來下載 React 相關的依賴。

用 Vite 建立專案

過去大家習慣用 create-react-app,但它已逐漸被淘汰。現在主流的做法是使用 Vite,它啟動快、設定少,非常適合初學者。

在終端機輸入以下指令:

npm create vite@latest my-react-app -- --template react

接著進入資料夾、安裝依賴並啟動開發伺服器:

cd my-react-app
npm install
npm run dev

成功後終端機會顯示一個網址(通常是 http://localhost:5173/),用瀏覽器打開就能看到 Vite 預設的 React 畫面了。

專案結構快速導覽

打開專案後,幾個現階段需要認識的檔案:

my-react-app/
├── index.html          # 唯一的 HTML 進入點
├── package.json        # 專案資訊與依賴清單
└── src/
    ├── main.jsx        # 程式進入點,把 App 掛載到頁面上
    ├── App.jsx         # 最上層的元件
    └── components/     # 我們等一下會把自己的元件放這裡

src/main.jsx 大致長這樣,它的工作是把 App 元件「渲染」到 index.html 裡 id 為 root 的容器中:

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.jsx";

createRoot(document.getElementById("root")).render(
  <StrictMode>
    <App />
  </StrictMode>
);

理解 JSX 語法 + Component 概念

什麼是 Component?

Component(元件)就是一個會回傳畫面的 JavaScript 函式。 React 的核心思想是把 UI 拆成一塊塊獨立、可重複使用的元件,再像積木一樣組合起來。

一個最簡單的元件:

function Hello() {
  return <h1>Hello, React!</h1>;
}

export default Hello;

要注意兩個慣例:

什麼是 JSX?

JSX 是一種讓你「在 JavaScript 裡寫 HTML 樣子的標記」的語法糖。瀏覽器看不懂 JSX,所以 Vite 會在背後把它編譯成普通的 JavaScript。

JSX 有幾個和 HTML 不同、初學者最常踩雷的地方:

function Demo() {
  const name = "Clark";

  return (
    <div className="card">
      {/* 1. 用大括號 {} 在 JSX 裡塞入 JavaScript */}
      <p>Hello, {name}</p>

      {/* 2. class 要寫成 className(因為 class 是 JS 保留字)*/}
      {/* 3. 多個元素必須包在「一個」最外層標籤裡 */}
    </div>
  );
}

重點整理:

規則說明
{ }在 JSX 中嵌入 JavaScript 變數或運算式
className取代 HTML 的 class
單一根元素return 只能回傳一個最外層標籤(可用 <>...</> 包起來)
自閉合標籤<img /><br /> 都要記得加 /

JSX 與 TSX 的差別

你可能會看到副檔名有時是 .jsx、有時是 .tsx,差別其實只在於「用哪種語言寫」:

本系列為了專注在 React 概念,會先用 .jsx;之後熟悉了、學過 TypeScript 再轉用 .tsx 享受型別檢查的好處。

動手做:Greeting Component

理論看完了,來寫第一個真正的元件。我們在 src/components/ 底下新增一個 Greeting.jsx

最基本的版本

function Greeting() {
  return <h2>歡迎來到 React 的世界!</h2>;
}

export default Greeting;

然後在 App.jsx 裡使用它:

import Greeting from "./components/Greeting";

function App() {
  return (
    <div>
      <Greeting />
    </div>
  );
}

export default App;

存檔後瀏覽器會自動更新,你就能看到那行歡迎訊息了。

加上 Props:讓元件接收資料

寫死的文字沒什麼用,元件真正的威力在於可以「接收外部傳進來的資料」,這個機制叫做 props

function Greeting({ name }) {
  return <h2>哈囉,{name}!歡迎來到 React 的世界 🎉</h2>;
}

export default Greeting;

這裡 { name } 是把傳進來的 props 物件直接解構出 name 屬性。使用時像 HTML 屬性一樣傳值:

function App() {
  return (
    <div>
      <Greeting name="Clark" />
      <Greeting name="Alice" />
      <Greeting name="Bob" />
    </div>
  );
}

同一個 Greeting 元件,傳入不同的 name,就渲染出三段不同的問候語——這就是「可重複使用」的具體展現。

動手做:UserCard Component

最後我們把概念再往前推一步,做一張顯示使用者資訊的 UserCard。它會接收多個 props,並示範如何處理物件與條件渲染。

新增 src/components/UserCard.jsx

function UserCard({ name, role, avatar, isOnline }) {
  return (
    <div className="user-card">
      <img src={avatar} alt={name} width={64} height={64} />
      <h3>{name}</h3>
      <p>{role}</p>

      {/* 條件渲染:依 isOnline 顯示不同狀態 */}
      <span>{isOnline ? "🟢 線上" : "⚪ 離線"}</span>
    </div>
  );
}

export default UserCard;

幾個新觀念:

App.jsx 中使用:

import UserCard from "./components/UserCard";

function App() {
  return (
    <div>
      <UserCard
        name="Clark Liu"
        role="後端工程師"
        avatar="https://i.pravatar.cc/64?img=12"
        isOnline={true}
      />
      <UserCard
        name="Alice Wang"
        role="設計師"
        avatar="https://i.pravatar.cc/64?img=5"
        isOnline={false}
      />
    </div>
  );
}

export default App;

注意 isOnline={true}:當 props 的值是字串以外的型別(布林、數字、物件、變數)時,必須用大括號 {} 包起來,而不是用引號。

進階一步:用陣列渲染多張卡片

實務上資料通常來自一個陣列。搭配 JavaScript 的 map(),可以一次渲染多張卡片:

import UserCard from "./components/UserCard";

const users = [
  {
    id: 1,
    name: "Clark Liu",
    role: "後端工程師",
    avatar: "https://i.pravatar.cc/64?img=12",
    isOnline: true,
  },
  {
    id: 2,
    name: "Alice Wang",
    role: "設計師",
    avatar: "https://i.pravatar.cc/64?img=5",
    isOnline: false,
  },
  {
    id: 3,
    name: "Bob Chen",
    role: "PM",
    avatar: "https://i.pravatar.cc/64?img=8",
    isOnline: true,
  },
];

function App() {
  return (
    <div>
      {users.map(user => (
        <UserCard
          key={user.id}
          name={user.name}
          role={user.role}
          avatar={user.avatar}
          isOnline={user.isOnline}
        />
      ))}
    </div>
  );
}

export default App;

這裡的 key={user.id} 很重要:當你用 map 渲染清單時,React 需要一個獨一無二的 key 來辨識每個元素,方便它做高效更新。通常用資料的 id 當 key。

小結

這篇我們完成了:

下一篇我會繼續記錄 State 與事件處理useStateonClick),讓元件不只是顯示資料,還能「互動」。


建議修改
在以下平台分享此文章:

下一篇
Leetcode 刷題記錄(1)