从零手写 useReducer:一个计数器教你如何用 TypeScript 管理 React 状态

33 阅读2分钟

useReducer 不是复杂,而是更清晰、更可预测、更适合中大型项目!

本文通过一个简单的计数器示例,带你从零开始实现 useReducer,并用 TypeScript 实现类型安全,让你彻底理解它的核心思想。


一、为什么不用 useState?

我们先看一个常见的场景:计数器。

carbon.png

这没问题,但如果:

  • 需要多个状态(如 count、step、max)
  • 需要复杂的逻辑(如限制最大值)
  • 需要日志记录或撤销功能

你会发现 useState 很快变得混乱!


二、引入 useReducer:状态管理的“函数式思维”

useReducer 是 React 提供的一个 Hook,用于处理复杂的状态逻辑

它接收两个参数:

  • reducer:一个函数,定义状态如何变化
  • initialState:初始状态

返回一个数组:[state, dispatch]

✅ 核心思想:

状态变化 = 函数调用
每次调用 dispatch(action),都会触发 reducer 计算新状态


三、动手实现:一个完整的计数器

1. 定义类型(TypeScript)

carbon (1).png

✅ 使用联合类型(Union Types)确保类型安全

2. 编写 reducer 函数

carbon (2).png

✅ 注意:reducer 必须返回新对象,不能修改原 state

3. 使用 useReducer

carbon (3).png

四、为什么 useReducer 更好?

表格

特性useStateuseReducer
状态更新逻辑分散在组件中集中在 reducer 中
类型安全强(配合 TS)
可测试性好(reducer 是纯函数)
可组合性好(可复用)

✨ useReducer 的优势在于:把“状态变化”变成“函数”,更容易测试和维护。

五、进阶技巧:自定义 Hook 封装

你可以将 useReducer 封装成一个自定义 Hook:

carbon (1).png

然后在组件中使用:

carbon (2).png

✅ 更简洁,更易复用!


六、总结

  • useReducer 不是为简单状态设计的,而是为复杂逻辑服务的
  • 它让状态变化集中、可预测、可测试
  • 配合 TypeScript,可以实现极致的类型安全
  • 别再用 useState 写复杂逻辑了,试试 useReducer 吧!