当状态更新逻辑超过两行、或者一个操作要同时改多个关联字段时,继续用一堆 useState 会让代码散落得到处都是。useReducer 把所有变更收拢到一个 reducer 纯函数里:传入当前 state 与 action,返回新 state。组件只负责派发 action,逻辑与视图解耦,测试也更容易。
经典搭档场景是复杂表单:一个 action 携带字段名和值,reducer 里统一更新; undo/redo、分页器、购物车这种规则多的场景同样适合。初学者别把它神化——能一个 useState 搞定的简单状态,硬套 reducer 反而增加模板代码。
import { useReducer } from 'react'; function formReducer(state, action) { switch (action.type) { case 'field': return { ...state, [action.name]: action.value }; // 不可变更新 case 'reset': return { name: '', age: '' }; default: return state; } } function Form() { const [state, dispatch] = useReducer(formReducer, { name: '', age: '' }); return ( <form> <input value={state.name} onChange={(e) => dispatch({ type: 'field', name: 'name', value: e.target.value })} /> <button type="button" onClick={() => dispatch({ type: 'reset' })}>重置</button> </form> ); }