es6 class 是构建可维护状态机的理想骨架,通过私有字段封装状态、受控方法驱动迁移、map 定义转移表、钩子管理副作用,并与 react 函数组件协同实现逻辑分离与复用。

ES6 Class 本身不内置状态机逻辑,但它是构建可维护、可扩展状态机的理想骨架。关键不是“用 class 实现状态机”,而是用 class 封装状态流转规则、事件响应和内部一致性校验,避免状态散落在函数或 hooks 中难以追踪。
明确状态与动作的边界
一个健壮的状态机必须区分“当前状态”和“触发动作”。Class 提供了天然的私有字段(#state)和受控方法来隔离这两者:
- 用私有字段(如
#currentState)保存唯一可信源,禁止外部直接修改 - 所有状态变更必须通过公共方法(如
transition(event))驱动,该方法内部做合法性校验 - 每个动作对应一个明确的事件名(如
'FETCH_START'),而不是任意字符串或布尔值
用 Map 预置状态转移表
把状态迁移逻辑从 if-else 或 switch 中抽离出来,用 Map 或嵌套对象定义“当前状态 + 事件 → 下一状态”的映射关系:
- 例如:
this.#transitions.get(this.#currentState)?.get(event)可快速查出目标状态 - 未定义的迁移自动视为非法,抛出清晰错误(如
Invalid transition: ${event} from ${this.#currentState}) - 支持运行时动态注册新迁移(适合插件化场景),只需更新 Map 即可
封装副作用与监听机制
状态变更往往伴随副作用(如 API 调用、UI 更新、日志上报)。Class 可统一管理这些行为:
- 在
transition()内部调用this.#onStateChange(newState, oldState)钩子 - 允许外部通过
on('statechange', handler)订阅,内部用EventTarget或自维护回调队列实现 - 关键副作用(如取消上一个请求)放在钩子里处理,确保状态与行为严格同步
与 React 函数组件协同使用
不要在组件内重复实现状态机逻辑。推荐模式是:Class 负责纯业务状态流转,React 组件只负责消费和触发:
- 在组件中实例化状态机(如
const machine = useMemo(() => new OrderStateMachine(), [])) - 用
useReducer或useState同步其currentState属性,驱动 UI 渲染 - 点击按钮等交互调用
machine.transition('CONFIRM'),而非直接 setState - 这样既保留函数组件的简洁性,又让复杂状态逻辑可测试、可复用、可调试











