← 第 3 关 – 大师

第 6/10 课 ⏱ 90 分钟 高级版

大重建:用 React 重写你的网站

把第 1 级网站用 React 再建一遍。同一个网站,第三次——这次像专业人士。

你的任务

把第 1–2 级的网站用 React 再建。像退步?不是——最好的训练:内容和设计已经有了,可以专心新技术。最后你会黑白分明地看到专业人士为什么觉得值得。

重建计划

  1. 把网站拆成组件。 拿纸笔(认真的!)把网站画成盒子:Header、Gallery、Quiz、Footer……每个盒子 = src/ 里一个文件。

  2. 把 HTML 移进组件。 从旧 .html 文件一块块复制到 JSX。注意熟悉的差异:classclassName,每个组件返回一个包裹元素。图片复制到 Vite 项目的 public/ 文件夹——路径像 /images/team.jpg 不用改。

  3. 移 CSS。style.css 内容复制到 src/App.css。几乎不用改——CSS 还是 CSS。

  4. 把数据抽成数组。 卡片、结果、画廊照片——重复的都变成对象数组 + .map(),组件课里学的方式。

  5. 把第 2 级法术改写成 state。 对照表:

    Level 2 (plain JavaScript)React
    getElementById + textContentstate + {value} in JSX
    addEventListener("click", ...)onClick={...}
    classList.toggle + CSS .hiddenboolean state + {condition && (...)}
    a counter with a variableuseState with a number

跟我看:React 方式的深色模式

一起重写一个法术,看转换:

import { useState } from 'react';
import Header from './Header.jsx';
import Gallery from './Gallery.jsx';

function App() {
  const [dark, setDark] = useState(
    localStorage.getItem("mode") === "dark"
  );

  function toggleMode() {
    const newMode = !dark;
    setDark(newMode);
    localStorage.setItem("mode", newMode ? "dark" : "light");
  }

  return (
    <div className={dark ? "dark" : ""}>
      <Header onToggle={toggleMode} dark={dark} />
      <Gallery />
    </div>
  );
}

export default App;

Header.jsx 里,按钮通过 prop 收到函数:

function Header({ onToggle, dark }) {
  return (
    <header>
      <h1>My website</h1>
      <button onClick={onToggle}>{dark ? "☀️" : "🌙"}</button>
    </header>
  );
}

最后一样新东西:prop 也可以是函数App 拥有 state,借给子组件切换按钮。这叫”state 在顶层”,是 React 最常见的模式。

重建清单

💡

卡住是游戏的一部分。 这课是马拉松不是 sprint——可以分几天做。卡住时:控制台(F12)、Vite 错误信息、对照前面课的示例。专业人士就是这样 debug 的。

检查一下: 网站在 localhost 运行,看起来(几乎)和之前一样——但里面是组件、数据和 state。试试在数据数组加一张卡片,看要多少工作。 就是 React 存在的全部理由。

这堂课你要记住