常问问题常见问题索引On this pageRedux 常见问题 目录 通用问题 我什么时候应该学习 Redux? 我什么时候应该使用 Redux? Redux 只能和 React 一起使用吗? 使用 Redux 需要特定的构建工具吗? Reducer 如何在两个 reducer 之间共享状态?我必须使用 combineReducers 吗? 处理 action 一定要用 switch 语句吗? 状态组织 我必须把所有状态都放进 Redux 吗?我还应该使用 React 的 useState 或 useReducer 吗? 可以把函数、Promise 或其他不可序列化的值放进 store 状态吗? 如何组织嵌套或重复的数据? 应该把表单状态或其他 UI 状态放进 store 吗? Store 配置 可以或应该创建多个 store 吗?可以直接导入 store 并在组件中使用吗? store enhancer 中可以有多条中间件链吗?中间件函数里的 next 和 dispatch 有什么区别? 如何只订阅部分状态?能否在订阅回调中获取派发的 action? Action 为什么 type 应该是字符串或至少可序列化?为什么 action 类型应该是常量? reducer 和 action 总是一一对应吗? 如何表示 AJAX 调用等“副作用”?为什么需要 action creator、thunk 和 middleware 来处理异步行为? 应该使用哪种异步中间件?如何在 thunk、saga、observable 等方案之间选择? 应该在一个 action creator 中连续派发多个 action 吗? 不可变数据 不可变性有哪些好处? 为什么 Redux 要求不可变性? 有哪些处理数据不可变性的方法?必须使用 Immer 吗? 手动编写不可变更新有哪些问题? 代码结构 文件结构应该是什么样?如何组织 action creator、reducer 和 selector? 如何在 reducer 和 action creator 之间拆分逻辑?“业务逻辑”应该放在哪里? 为什么要使用 action creator? WebSocket 和其他持久连接应该放在哪里? 如何在非组件文件中使用 Redux store? 性能 Redux 在性能和架构方面的扩展能力如何? 每个 action 都调用所有 reducer,会不会很慢? 必须在 reducer 中深拷贝状态吗?复制状态会不会很慢? 如何减少 store 更新事件的次数? 只有一棵状态树会造成内存问题吗?派发很多 action 会占用内存吗? 缓存远程数据会造成内存问题吗? 设计决策 为什么 Redux 不把 state 和 action 传给订阅者? 为什么 Redux 不支持用类定义 action 和 reducer? 为什么 middleware 的签名使用柯里化? 为什么 applyMiddleware 用闭包封装 dispatch? 为什么 combineReducers 调用每个 reducer 时不把整个 state 作为第三个参数传入? 为什么 mapDispatchToProps 不能使用 getState() 或 mapStateToProps() 的返回值? React Redux 为什么要使用 React-Redux? 为什么我的组件没有重新渲染? 为什么我的组件重新渲染得太频繁? 如何从 store 中选择多个值? 如何在 React 18 和 React 19 中使用 Redux? 如何在组件外访问 store? 如何为 useSelector 和 useDispatch 添加类型? connect 仍受支持吗? Redux 与 React Context API 有什么区别? 其他问题 有哪些规模较大的“真实” Redux 项目? 如何在 Redux 中实现身份验证?