← React Course

REACT CORE · 96

Component / JSX:把 UI 當成資料的投影

React 不是「比較方便寫 HTML」。真正的模型是:給定 props / state,component 計算出下一個 UI 描述,React runtime 再把必要差異反映到 DOM。

Why now:為什麼先學 DOM,現在才學 React?

因為你已經知道原生 Browser 模型:

event→update state→render()→DOM

React 只是把「state → UI」這件事系統化。若不知道 DOM / event / state,本來很容易把 React API 當成魔法。

Learning outcomes

1. JSX 不是 Browser 原生語法

function Greeting() {
  return <h1>Hello</h1>;
}

JSX 需要 build tooling 轉成一般 JavaScript。Browser 真正執行的是 build 後的 JavaScript bundle。

.jsx / .tsxbuildJavaScriptBrowserReact runtimeDOM

2. Component 是 function,不是 HTML template 檔案

function CourseCard({
  title,
  score
}) {
  return (
    <article>
      <h2>{title}</h2>
      <p>{score}</p>
    </article>
  );
}

這裡的 title / score 是 JavaScript values;JSX 只是描述它們要如何映射成 UI。

3. Capitalized component vs lowercase element

<CourseCard />
<button>Save</button>
寫法React 理解
<CourseCard />呼叫你定義的 component
<button>建立/更新原生 DOM button

4. Composition:大畫面拆成責任清楚的小 component

function App() {
  return (
    <main>
      <Header />
      <CourseSummary />
      <CourseList />
    </main>
  );
}

不要因為能拆就無限拆。Component boundary 應該對應可理解的 UI responsibility / reuse / state boundary。

5. Render phase 應盡量是 pure calculation

function Summary({
  courses
}) {
  const passed =
    courses.filter(
      c => c.score >= 60
    ).length;

  return (
    <p>
      Passed: {passed}
    </p>
  );
}

render 過程應主要計算 UI,而不是偷偷送 request、改 global variable、寫 localStorage。Side effects 後面才集中處理。

Project checkpoint:Course Dashboard v1

const courses = [
  {
    id: 1,
    title: "JavaScript",
    score: 92
  },
  {
    id: 2,
    title: "C++",
    score: 78
  }
];

function CourseCard({
  course
}) {
  return (
    <article>
      <h2>{course.title}</h2>
      <p>Score: {course.score}</p>
    </article>
  );
}

function App() {
  return (
    <main>
      <h1>Course Dashboard</h1>

      {courses.map(course => (
        <CourseCard
          key={course.id}
          course={course}
        />
      ))}
    </main>
  );
}

現在資料還是 module 常數;下一課才加真正 state。

Debug evidence:畫面沒出來先分 build 還是 runtime

Knowledge check

  1. Browser 直接理解 JSX 嗎?
  2. <CourseCard /> 與 <article> 的角色有什麼不同?
  3. 為什麼 render phase 不適合直接做 network request?
  4. 把 Course Dashboard 拆成 Header、CourseList、CourseCard,說明每個 boundary 的理由。