## 📚 技术栈背景 | Tech Stack & Context - 列出所有的相关技术/语言 - [[public/CODE/React|React]] - [[TypeScript]] - 主题:一句话总结这张卡片讲解了什么? - React 中什么是 State、何时该用它、以及如何用 `useState` 管理组件状态 - 相关文档 - [State: A Component's Memory – React v19.1](https://react.dev/learn/state-a-components-memory) - [State and Lifecycle – React V18.2.0](https://legacy.reactjs.org/docs/state-and-lifecycle.html) ## 🧩 相关场景 | Context - 契机:为什么现在写它? - - 作用:它解决了什么问题? - 让组件拥有“记忆”和“响应性”。 - 应用场景:你未来会在什么地方用到它? - 表单输入 - 页面交互(比如按钮点击次数) - 控制 UI 状态(loading 状态、是否显示弹窗等) ## 🔑 基本概念 | Key ### What is State? - State 就是 **组件内部“记住”的值**,每次渲染都会基于它来生成 UI。 - 它是 React 中响应式的核心——**只要 state 变了,组件就会重新渲染**。 特点: - 内部的(不会通过 props 传递进来) - 会变的(由用户行为或异步事件改变) - 无法从别的变量推导(必须单独“记住”) [[#1. 如何判断一个值是否应该是 State?]] ### useState - What is useState? - useState 是一个 [[React中的Hook|Hook]] - Why we need useState? 1. 记住变量:A **state variable** to retain the data between renders. 2. 更新变量:A **state setter function** to update the variable and trigger React to render the component again. - 语法: ```jsx const [state, setState] = useState(initialValue); ``` - 含义:当你调用 `useState(initialValue)` 时,React会返回一个包含两个元素的数组: - state:当前的状态值 current value - setState:一个 function,用于更新 state - initialValue:初始值 - state, setState 需要自己取名,见 [[React中的命名规范#状态变量 State Variables]] - 规则 - 只能在组件顶层使用 Hooks(不能在循环、条件或嵌套函数中使用) ## 🔄 工作流程 | Flow ### 总体流程 1. 明确哪些变量需要用 state 保存 2. 在组件中使用 `useState()` 初始化这个状态 3. 当用户操作或数据变化时,调用 `setState()` 触发更新 4. React 自动重新渲染组件,UI 和状态同步 ### 详细步骤 #### 1. 如何判断一个值是否应该是 State? - 同时满足以下 3 个条件,就应该用 state - 内部 internal:组件内部的 - props 传进来的值,明显不是 state - 变化 changing:随着用户操作而变化的 - 不会变的静态值,直接写 const - 最小 minimal:不能从其他 state 或 props 计算得出 - 能通过其他变量计算得到的,就不是 state - 特殊情况 - 组件初始化时生成的随机值(希望它在整个生命周期内保持不变) ```tsx const [id] = useState(() => generateUUID()); ``` - 想“记住”初始值用于对比或重置的场景(比如表单初始值) - 为什么?因为组件每次 render 都会重新执行函数体,普通变量会被重算,而 state 能帮你记住这个值。 #### 2. 在组件中使用 `useState()` 初始化状态 在组件的最上方引入并调用: ```js import { useState } from 'react' function MyComponent() { const [count, setCount] = useState(0) } ``` - `count` 是当前状态值 - `setCount` 是更新状态的函数 - `0` 是初始值(可以是任意类型) 你可以为多个值分别定义 state,也可以用一个对象/数组一次性管理多个字段。 #### 3. 在交互或逻辑中调用 `setState()` 触发更新 状态变更触发通常有以下几种场景: - 输入框变更(onChange) - 点击按钮(onClick) - 组件加载完成后初始化状态 示例: ```js <button onClick={() => setCount(count + 1)}>+1</button> ``` 注意: - 不要直接修改 state,例如不要写 `count++` 或 `count = 10` - set 函数本身是异步的,不能立即读取到更新后的值(如果需要立刻操作,考虑用 `useEffect`) ## 🤔 常见问题 / 提示 | Tips