首页 / React 19 入门教程 / State — 组件的记忆

React 19 入门教程

State — 组件的记忆

本教程共 50 篇 · 第 15 篇 · 更新于 2026-07-29 · 约 7 分钟阅读

ReactuseState状态组件记忆重新渲染

15. State — 组件的记忆

本节目标:理解状态是组件的”记忆”,掌握 useState 的声明和更新方式,明白为什么需要状态而不是普通变量。

普通变量为什么不够用

先看一个”看似能跑”的例子:

function Counter() {
  let count = 0;

  function handleClick() {
    count = count + 1;
    console.log(count); // 控制台数字变了
  }

  return <button onClick={handleClick}>点击 {count}</button>;
}

点击按钮,控制台打印 1、2、3… 但页面上始终显示”点击 0”。

问题出在哪?普通变量变化不会触发重新渲染。React 不知道该更新页面。

useState 的声明

useState 就是来解决这个问题的。它让 React 记住一个值,并在值变化时重新渲染:

import { useState } from 'react';

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

  function handleClick() {
    setCount(count + 1);
  }

  return <button onClick={handleClick}>点击 {count}</button>;
}

useState(0) 返回一个数组,解构出两个东西:

  • count:当前状态值
  • setCount:更新状态的函数

命名约定

状态变量叫 count,更新函数习惯叫 setCountsetXxx。这不是强制规定,但大家都这么写。

组件有了自己的记忆

每次调用 useState,React 就给这个组件分配一块”记忆”。重新渲染时,这块记忆还在:

function Counter() {
  const [count, setCount] = useState(0);
  // 第一次渲染:count = 0
  // 点击后 setCount(1),重新渲染,count = 1
  // 再点 setCount(2),重新渲染,count = 2
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

这就是”组件的记忆”——React 帮你把值存起来,每次渲染都能读到最新值。

状态是私有的

两个相同组件,各自有独立的状态:

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

页面上两个计数器,互不影响。它们各自调用 useState(0),各自有独立的 count

状态隔离是 React 的核心设计

组件之间天然隔离。想让两个组件共享数据?把状态提到父组件,通过 props 传下来。后面会专门讲。

状态和 props 的区别

一句话区分:props 是外部传入的参数,状态是组件内部自己管理的数据

props状态
来源父组件传入组件内部声明
能否修改不可直接修改通过 setXxx 修改
变化时父组件重新渲染触发调用 setXxx 触发
function Greeting({ name }) {
  const [mood, setMood] = useState('开心');

  // name 是 props,来自父组件
  // mood 是状态,自己管理
  return (
    <div>
      <p>{name} 今天{mood}</p>
      <button onClick={() => setMood('兴奋')}>
        变兴奋
      </button>
    </div>
  );
}

多个状态变量

一个组件可以有多个状态:

function Form() {
  const [name, setName] = useState('');
  const [age, setAge] = useState(0);
  const [city, setCity] = useState('');

  return (
    <form>
      <input value={name} onChange={e => setName(e.target.value)} />
      <input value={age} onChange={e => setAge(Number(e.target.value))} />
      <input value={city} onChange={e => setCity(e.target.value)} />
    </form>
  );
}

什么时候合并成对象

多个状态总是一起变化时,可以考虑合并成一个对象。否则分开写更清晰。后面”状态结构选择”会详细讲。

本节要点

  • 普通变量变化不触发渲染,状态会
  • useState 返回 [值, 设置函数]
  • 每个组件的状态是私有的、隔离的
  • props 是外部参数,状态是内部数据