将全量状态存入Redux并按页面分组是否为有效实现方案?
关于Redux状态组织与页面状态管理的解答
我完全理解你作为Redux新手的这种困惑——判断哪些状态该存入Redux、哪些留在本地,确实是入门阶段最头疼的问题之一!结合你的需求和当前的实现,我来逐一解答你的疑问:
1. 为了特定需求,把所有状态存入Redux完全合理
如果时间旅行调试、从配置文件预加载全局状态这些是你明确的硬需求,那将所有状态放在Redux里绝对是正确的选择。Redux的设计本来就支持全局状态的统一管理,这些高级功能正是它的优势所在,没必要因为“常规做法”而妥协自己的核心需求。
2. 按页面/路由分组状态不是反模式,反而很优秀
你当前的状态结构非常清晰:
{ reduxRoute: { /* 全局共享状态 */ }, session: { /* 全局共享状态 */ }, data: { /* 全局共享状态 */ }, scenes: { Page1: { state1: { /* Page1专属UI状态 */ }, state2: { /* Page1专属UI状态 */ }, data: { /* Page1专属数据状态 */ } }, Page2: { state3: { /* Page2专属UI状态 */ }, state4: { /* Page2专属UI状态 */ }, otherData: { /* Page2专属数据状态 */ } } } }
这种将页面专属状态封装在对应scenes.PageX节点下的方式,让状态结构和应用的文件夹/UI结构完全对应,既避免了全局状态的混乱,又保留了Redux的全局可控性,是非常棒的模块化组织方式,完全不是反模式。
3. 页面切换时重置状态的方案可行,还能优化
你考虑在componentDidUnmount中触发RESET_PAGE1_STATE的思路是有效的,能避免页面切换后残留无用状态。不过可以优化得更统一:
- 借助路由切换的action(比如React Router相关的路由变更action),在页面对应的reducer中监听路由切换事件,自动清除当前页面的状态,不用每个页面都手动写卸载逻辑。
- 也可以在进入新页面时,主动初始化该页面的状态,覆盖旧值,同样能达到清理的效果。
两种方式都能解决你的问题,选你觉得更符合项目风格的即可。
4. 为什么很少有人推荐全状态存入Redux?
大部分常规应用其实不需要时间旅行、全局状态快照这类强需求,很多本地状态(比如单个输入框的临时值、组件的展开收起状态)放在组件内部会更轻量,没必要增加Redux的action、reducer复杂度。但你的需求特殊,你的方案完全适配自己的场景,不用觉得“和别人不一样就是错的”。
总之,你的当前方案完全符合你的需求,状态结构清晰、维护性强,继续用下去就好!
内容的提问来源于stack exchange,提问作者Soren
相关产品推荐
相关产品推荐

