← 第 3 关 – 大师

第 5/10 课 ⏱ 40 分钟 高级版

State:会记忆的应用

学 useState——组件的记忆。应用开始用 React 方式响应点击。

为什么普通变量不够

第 2 级你每次点击后自己重写按钮文字做计数器。React 不同:你改 数据,React 重绘屏幕。但要把数据交给叫 state 的特殊盒子——否则 React 注意不到变化。

跟我看:React 里的计数器

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Clicked: {count}×
    </button>
  );
}

export default Counter;

最重要一行拆解——const [count, setCount] = useState(0);

onClick={...} 是 React 版的 addEventListener("click", ...)——直接在 JSX 里。

注意代码里 没有 的:没有 getElementById,没有 textContent。你不说 怎么 改屏幕——只说 现在什么是真的count 现在是 5),屏幕自己对齐。

跟我看:state 控制可见内容

State 不必只是数字。可折叠区块,React 方式:

import { useState } from 'react';

function Menu() {
  const [open, setOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setOpen(!open)}>
        {open ? "Hide the menu ▲" : "Show the menu ▼"}
      </button>

      {open && (
        <ul>
          <li>Monday: tomato soup with pasta</li>
          <li>Tuesday: chicken with rice</li>
          <li>Wednesday: pancakes with jam</li>
        </ul>
      )}
    </div>
  );
}

两个 JSX 新技巧:

!open 是”相反”——true 变 false,反之亦然。一行 = 开关。

轮到你了 💪

给应用加两个用 state 的东西:

  1. 可折叠区块true/false state)符合项目:🏫 可折叠午餐菜单 · 🙋 “显示/隐藏我最爱的游戏” · 🌍 可折叠国家列表 · ⚽ 可折叠名单。
  2. 计数器或投票(数字 state):🏫 班级旅行投票 · 🙋 “今天多少人跟我打招呼” · 🌍 去过的国家计数 · ⚽ 记分牌,带 +1 home / +1 away 按钮(两个 state!)。
额外参考答案:两个 state 的记分牌
import { useState } from 'react';

function Score() {
  const [home, setHome] = useState(0);
  const [away, setAway] = useState(0);

  return (
    <div className="card">
      <h3>Riverside {home} : {away} Lakeside</h3>
      <button onClick={() => setHome(home + 1)}>Home goal ⚽</button>
      <button onClick={() => setAway(away + 1)}>Away goal 😤</button>
      <button onClick={() => { setHome(0); setAway(0); }}>New match</button>
    </div>
  );
}

export default Score;

一个组件想要多少盒子都行——每个 useState 是一个。

检查一下: 应用至少两个互动点,代码里没有任何 getElementById。掌握这个思维转变(“我改数据,不改屏幕”),就掌握了 React 最难的部分。

这堂课你要记住