状态存储设计疑问:UI状态与应用状态区分及选中活动ID存储位置
应用状态与UI状态区分:选中活动ID的归属分析
先帮你理清UI状态和应用状态的核心差异,再针对你的问题具体分析:
- UI状态:本质是和页面交互、展示强绑定的临时状态——比如当前选中的列表项、弹窗开关状态、表单里还没提交的输入值。这类状态刷新页面就会消失,而且通常只服务于某个特定的UI组件或页面,和核心业务逻辑关联较弱。
- 应用状态:是整个应用共享的、支撑业务流程的核心状态——比如已加载的实体数据(像你状态里的
sale-activities和sale-activity-announcements)、用户登录信息、全局业务配置。这类状态是业务逻辑的基础,即使刷新页面,也需要重新获取来恢复业务场景。
回到你的问题:选中的活动ID(selectedActivityId)更偏向UI状态,但具体存在哪个切片,要看它的使用场景:
场景1:仅用于列表交互控制
如果这个ID只是用来标记列表项的高亮状态、切换当前展示的公告面板,没有其他业务模块依赖它(比如其他页面、其他API调用不需要知道当前选中了哪个活动),那它完全属于UI状态,建议放在专用的UI切片(比如sale-activity-listing)里。
这样做的好处是把业务数据状态和UI交互状态彻底分离,让每个切片的职责更清晰:
sale-activities切片专注管理活动数据的加载状态、已加载的活动ID列表这类业务相关的内容;sale-activity-listing切片集中管理列表的UI交互状态,比如选中项、搜索关键词、筛选面板状态等。
调整后的状态结构大概是这样:
{ "entities": { /* 保持原有实体数据 */ }, "sale-activities": { "loaded": true, "loading": false, "ids": [1, 2], "offset": 0 // 移除selectedActivityId }, "sale-activity-announcements": { /* 保持原有内容 */ }, "sale-activity-listing": { "selectedActivityId": 1 // 可扩展其他列表UI状态,比如searchQuery: "", isFilterOpen: false等 }, "selectedVehicleId": 3 }
场景2:作为业务逻辑的依赖项
如果这个选中的ID会被其他业务逻辑复用——比如其他API调用需要基于它获取关联数据、全局的业务流程(比如提交活动审批)需要用到当前选中的活动ID,那它可以归为应用状态,放在sale-activities切片里也是合理的。
总结
其实没有绝对的对错,核心原则是状态的职责单一化:让每个切片只管理一类状态。如果你的selectedActivityId只是UI交互的临时标记,那专用UI切片是更清晰的选择;如果它是业务流程的核心依赖,留在sale-activities切片也没问题。
内容的提问来源于stack exchange,提问作者darkwing
相关产品推荐
相关产品推荐

