用途
State Management 是一个状态归属决策技能,核心问题不是「用哪个状态库」,而是:这份状态是什么数据包、应该由谁拥有、要避免哪个看似诱人但错误的拥有者。它要求先命名一个主数据包,再选择与其生命周期匹配的最小拥有者,而不是一上来就展开库的对比。
主要能力
- 判断前端问题属于哪类状态:本地 UI 状态、共享子树状态、URL/导航状态、表单状态、服务端状态,还是长期存活的客户端工作流状态。
- 把「我们需要状态管理」这类模糊请求转化为具体的归属建议。
- 在 Context、Zustand、Redux Toolkit、Jotai、TanStack Query 或路由原生归属之间做选择,且不把它们视为可互换。
- 在实现开始前阻止「一个 store 装下所有东西」的方案。
- 为实施或评审产出一份简短的归属说明(ownership brief)。
使用方式
技能按步骤执行:
- 先选一个主数据包(local-ui、shared-subtree、url-navigation、form-lifecycle、server-state、client-workflow),可列一两个次要数据包,但强制只有一个主数据包。
- 选择与数据包匹配的最窄拥有者:local-ui 用本地状态、提升状态或 useReducer;shared-subtree 用 Context;url-navigation 用路由/搜索参数;form-lifecycle 由表单层拥有;server-state 用 TanStack Query 或路由原生数据 API;client-workflow 才考虑 Zustand、Redux Toolkit、Jotai 或显式状态机建模。
- 运行反模式检查,明确指出最可能的错误拥有者,例如:为不相关生命周期设一个通用 store、无离线/工作流理由却把服务端缓存镜像进客户端 store、把可分享的筛选或标签藏在 URL 之外、把表单脏值/触碰/提交生命周期塞进全局应用状态、把所有慢或出错的 UI 问题都当成状态架构问题。
- 只有在仍存在 client-workflow 数据包时,才比较客户端 store 选项。
- 直接命名混合架构,例如 URL 状态 + query/路由数据 + 本地 UI 状态、Context + query/路由数据、Zustand + query/路由数据等。
- 立即把相邻工作路由出去:重渲染/水合/瀑布/性能问题交给 react-best-practices;变更契约或前后端职责交给 api-design;已损坏的状态行为交给 debugging;组件 API 归属或系统级偏好治理交给 design-system;布局/视口行为交给 responsive-design。
- 产出一份简短归属说明,包含主数据包、次要数据包、推荐拥有者、为何这是最小可行拆分、要避免什么、路由说明和下一步实现动作。
处理混合或模糊请求前应阅读 references/ownership-packets-and-route-outs.md;数据包清晰、需要比较可能拥有者时阅读 references/decision-matrix.md;请求可能实际属于其他技能时阅读 references/handoff-boundaries.md。
适用场景
- 判断某个前端问题属于本地 UI 状态、共享子树状态、URL/导航状态、表单状态、服务端状态还是长期客户端工作流状态。
- 把模糊需求转化为具体归属建议。
- 在多个状态方案之间做有依据的选择。
- 在实现前阻止「一个 store 装下所有东西」。
- 为实施或评审产出简短归属说明。
限制
以下情况不应使用本技能:主要任务是重渲染抖动、水合不匹配、瀑布或客户端/服务端性能行为;主要任务是变更形态、后端归属或乐观写入 API 设计;主要任务是调试过期闭包、竞态、损坏的乐观更新或既有状态缺陷;主要任务是受控/非受控组件 API、原语、插槽或可复用组件契约;主要任务是视觉系统治理或共享偏好策略;主要任务是视口适配或布局塌陷。若架构选择已完成、用户只需要代码,应直接实现,而不是重新运行选择流程。
最佳实践
先选数据包再选工具;使用最小可行拥有者;除非有强理由,保持 URL/表单/服务端/客户端工作流生命周期分离;明确指出错误的拥有者;把混合归属视为正常而非标准化失败;以一份实施者或评审者可立即行动的简短说明收尾。
参考
React — Sharing State Between Components;React — Choosing the State Structure;React — Context;Redux FAQ — Organizing State;Redux — Why Redux Toolkit is How To Use Redux Today;TanStack Query — Does this replace client state managers?;React Router — State Management;Zustand;Jotai。