状态机
了解 如何在 XState 和 Stately Studio 中使用状态机。
状态机
状态机 是描述某物行为的模型,例如一个 actor。有限状态 机描述了当一个 事件 发生时,actor 的状态如何转换到另一个状态。
Setup
在 XState 版本 5 中,您现在可以使用 setup({ ... }) 函数来设置机器的类型和源。这有很多好处:
State
状态描述了机器的状态或模式,可以像暂停和播放一样简单。状态机一次只能处于一种状态。
上下文
在 XState 中,context 是你在状态机 actor 中存储数据的方式。
Input
输入是指提供给状态机的数据,这些数据会影响其行为。在 XState 中,您可以在使用 createActor(machine, { input }) 函数创建 actor 时,通过第二个参数提供输入:
Output
输 出是指actor生成的最终数据。当一个actor负责执行某些任务(例如进行网络请求或运行复杂计算)时,它将在完成任务后返回输出。输出代表actor工作的结果。actor只有在其状态为“done”时才会生成输出;即当它们处于最终状态时。
事件和转换
转换是从一个有限状态到另一个有限状态的变化,由事件触发。
无事件(always)转换
无事件转换 是在没有显式事件的情况下发生的转换。这些转换在转换启用时 总是 发生。
延迟(after)转换
延迟转换 是在设定的时间后触发的转换。延迟转换对于在应用程序逻辑中构建超时和间隔非常有用。如果在计时器结束之前发生了另一个事件,则转换不会完成。
Actions
动作是一次性执行的效果。当状态机转换时,它可能会执行动作。动作响应事件发生,通常在转换中的 actions [...] 属性中,或者在退出状态的任何转换中定义在状态的 exit: [...] 属性中。
守卫
守卫 是状态机在处理事件时检查的条件函数。如果条件为 true,状态机将执行到下一个状态的转换。如果条件为 false,状态机将继续检查其他条件以决定下一个状态。
初始状态
当状态机启动时,它首先进入初始状态。一个状态机只能有一个顶级初始状态;如果有多个初始状态,状态机将不知道从哪里开始!
有限状态
有限状态是状态机在任何给定时间内可能处于的状态之一。之所以称为“有限”,是因为状态机具有已知的有限数量的可能状态。状态表示机器在该状态下的“行为”;其状态或模式。
父状态
状态可以包含更多状态,也称为子状态。这些子状态仅在父状态处于活动状态时才处于活动状态。
并行状态
在状态图中,并行状态是具有多个子状态(也称为区域)的状态,这些子状态同时处于活动状态。这与父状态不同,在父状态中一次只有一个子状态处于活动状态。
终态
终态是表示机器完成或成功终止的状态。它由状态节点上的 type: 'final' 属性定义:
历史状态
历史状态是一种特殊类型的状态(称为伪状态),它记住父状态退出之前最后一个活跃的子状态。当从父状态外部的转换目标是历史状态时,记住的子状态将被进入。
持久化
Actors 可以持久化其内部状态并在以后恢复。持久化是指将 actor 的状态存储在持久存储中,例如 localStorage 或数据库。恢复是指从持久存储中恢复 actor 的状态。
标签
状态节点可以有标签,这些标签是帮助分组或分类状态节点的字符串术语。例如,您可以使用“loading”标签表示哪些状态节点代表正在加载数据的状态,并使用 state.hasTag(tag) 确定状态是否包含那些带标签的状态节点:
事件发射器
自 XState 版本 5.9.0 起