SuperAPI AI 工具集

react-state-machine

前端与建站

查看项目

更新于 10-15 17:28

技能介绍

该技能介绍如何用 XState v5 与 actor 模型在 React 中构建可复用状态机,把 UI 行为建模为显式的状态、转换与事件,从而让不可能的状态无法表达。XState v5 将状态机与 actor 模型统一,每个机器都是拥有独立生命周期的实体,便于组合。

适用触发场景:布尔标志爆炸(多个 isLoading、isError、isSuccess);用 if (isLoading && !isError && data) 隐式推导状态;为防止非法转换而做防御性守卫;跨状态的超时、延迟与防抖;状态之间相互依赖。

不适用:无异步的简单布尔切换(用 useState)、基础校验的单个表单字段(useReducer 足够)、服务端状态缓存(React Query/TanStack Query)、静态数据变换(useMemo)、简单计数器或开关。

核心心智模型:有限状态表示行为模式(idle、loading、success、error),组件同时只能处于一个状态;context(扩展状态)存放不定义独立状态的定量数据;事件对象如 { type: 'SUBMIT', data: formData } 触发转换;守卫用 { guard: 'hasValidInput' } 条件性允许或阻止转换;action 是转换或进入/退出状态时的即发即弃副作用;invoke 的 actor 是带生命周期管理与清理的长时运行过程(API 调用、订阅)。

用法上,v5 推荐 setup() 模式:注册 types(context 与 events)、actors(如 fromPromise 包装 fetch)、actions(assign 写入数据与错误),再 createMachine 定义 initial、context 与各状态及其 on、invoke、onDone、onError。React 集成按场景选择:简单组件状态用 useMachine;性能敏感场景用 useActorRef + useSelector 做选择性重渲染;全局或共享状态用 createActorContext。

需避免的反模式:用扁平状态处理正交关注点(应改用并行状态);在 assign 内 send 事件(应使用 raise);不纯的守卫(守卫必须无副作用);订阅整个状态(应用聚焦 selector);未记忆化 model(应使用 useRef)。

关键提醒:setup() 是 v5 写法,提供类型推断与 actor、action 注册;异步用 invoke,同步用 action;有限状态表示模式,context 存数据;先用 Stately Studio(stately.ai/editor)可视化。红旗信号:超过 3-4 个布尔标志、用复合条件判断模式、非法状态组合导致 bug、无法向干系人解释状态转换。相关技能包括 react、nextjs、test-driven-development(用 createActor 先测机器再接入 UI)。