State 与 Reducer
Hooks 让函数组件拥有 state 与副作用能力。本文介绍 useState 与 useReducer。见 React 基础。
useState
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button type="button" onClick={() => setCount((c) => c + 1)}>
{count}
</button>
);
}
| 要点 | 说明 |
|---|---|
| 更新是替换 | setCount(1) 用新值替换旧 state |
| 函数式更新 | setCount(c => c + 1) 基于上一状态计算,适合连续更新 |
| 批量更新 | 同一事件处理函数内多次 setState,React 18 会批量处理后再渲染(见 自动批处理) |
| 初始值惰性计算 | useState(() => expensiveInit()) 仅首次渲染执行 |
状态不可变更新
对象与数组应创建新引用,勿直接修改原 state:
// 对象
setUser((u) => ({ ...u, name: "新名字" }));
// 数组
setItems((items) => [...items, newItem]);
setItems((items) => items.filter((x) => x.id !== id));
useReducer
适合 state 结构复杂或下一状态依赖多种 action 类型:
type State = { count: number };
type Action = { type: "inc" } | { type: "dec" } | { type: "reset" };
function reducer(state: State, action: Action): State {
switch (action.type) {
case "inc":
return { count: state.count + 1 };
case "dec":
return { count: state.count - 1 };
case "reset":
return { count: 0 };
default:
return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<>
<span>{state.count}</span>
<button type="button" onClick={() => dispatch({ type: "inc" })}>
+1
</button>
</>
);
}
Redux Toolkit 的 reducer 风格与此类似,见 状态管理。
Hooks 规则
- 只在函数组件顶层或自定义 Hook 顶层调用,勿放在条件、循环内。
- 只从 React 函数或自定义 Hook 中调用 Hooks。
违反规则会导致 Hook 调用顺序错乱。可用 eslint-plugin-react-hooks 静态检查。
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| React:useState | API |
| React:useReducer | API |
| React:State 作为快照 | 渲染与 state |
相关文章
Effect 与副作用
useEffect 用于在组件渲染后执行与外部系统同步的逻辑(请求、订阅、手动改 DOM 等)。涵盖基本用法、依赖数组、适用/不适用场景、useLayoutEffect、最佳实践与常见坑。
Context
Context 在组件树中跨层级传递数据,避免 props 逐层透传。涵盖创建与使用、自定义 Hook 封装、性能拆分、与全局状态库对照、最佳实践与常见坑。
Memo、Callback 与 Ref
本文介绍 useRef、useMemo、useCallback、memo 及自定义 Hook。见 Effect。
状态管理
React 组件内 state 用 Hooks;跨组件共享状态可选 Context、Redux Toolkit、Zustand 等。见 Context Hook。
渲染与协调
React 将组件渲染为虚拟 DOM 树,再协调(reconciliation)到浏览器 DOM。理解该过程有助于解释 key、memo 与性能优化。涵盖渲染流程、Fiber、startTransition、Suspense、最佳实践与常见坑。
工程化
新建 React 项目时,官方与社区主流工具为 Vite;全栈场景常用 Next.js。涵盖 Vite + React、Create React App 现状、Next.js、目录结构、环境变量、部署、最佳实践与常见坑。
Series
hooks
4 / 4