useReducer 状态减速器

最后更新:2026-10-28

useReducer 状态减速器

useReducer 把「状态怎么变」集中到一个纯函数 reducer 里:dispatch(action) 触发,reducer 依 action 算出新状态。状态迁移多、逻辑复杂或多个值要一起变时,比一堆 useState 更清晰可测。

分组副作用与性能
类型Hook
引入版本React 16.8

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

function reducer(state, action) {
  switch (action.type) {
    case 'increment': return { count: state.count + 1 }
    case 'reset':     return { count: 0 }
    default:          return state    // 未知 action 返回原状态
  }
}

const [state, dispatch] = useReducer(reducer, { count: 0 })
dispatch({ type: 'increment' })

⚙️ 参数

reducer(state, action) => newState 的纯函数:不能有副作用,不能直接修改 state,必须返回新对象。
initialArg初始状态;第三个参数可传惰性初始化函数 init(initialArg)。

返回值:返回 [state, dispatch]:当前状态与派发函数。dispatch 引用恒定不变,可放心放进依赖数组或传给子组件。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

三个按钮分别派发 inc/dec/reset 三种 action,计数由 reducer 统一计算,UI 实时更新。

💡 要点

💡 提示 dispatch 函数引用稳定,作为 props 传给深层组件不必再包 useCallback。
ℹ️ 说明 reducer 必须是纯函数:请求数据、写 localStorage 等副作用放到事件处理器或 useEffect 里。
⚠️ 注意 直接修改 state(state.count++)是经典错误——始终返回新对象。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q useReducer 和 useState 怎么选?
A 独立简单值用 useState;多个值联动、更新逻辑复杂、下一步依赖上一步时用 useReducer。
Q reducer 里能发请求吗?
A 不能,reducer 必须是纯函数。请求放事件处理器或 effect,完成后 dispatch 存结果。
Q dispatch 之后能立刻读到新 state 吗?
A 不能。dispatch 只排队触发重渲染,本次闭包里的 state 仍是旧值;需要时用 useEffect 监听。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏