State
状态描述了机器的状态或模式,可以像暂停和播放一样简单。状态机一次只能处于一种状态。
这些状态是“有限的”;机器只能在您预定义的状态之间移动。
状态对象
状态对象表示正在运行的机器(actor)的当前状态,并包含以下属性:
value
:当前状态值,可以是:- 表示简单状态的字符串,例如
'playing'
,或: - 表示嵌套状态的对象,例如
{ paused: 'buffering' }
。
- 表示简单状态的字符串,例如
context
:当前的上下文(扩展状态)。meta
:包含状态节点元数据的对象。
const feedbackMachine = createMachine({
id: 'feedback',
initial: 'question',
context: {
feedback: '',
},
states: {
question: {
meta: {
question: 'How was your experience?',
},
},
},
});
const actor = createActor(feedbackMachine);
actor.start();
console.log(actor.getSnapshot());
// 记录包含以下内容的对象:
// {
// value: 'question',
// context: {
// feedback: ''
// },
// meta: {
// 'feedback.question': {
// question: 'How was your experience?'
// }
// }
// }
访问状态快照
您可以通过订阅 actor 或读取 actor 的 .getSnapshot()
方法来访问 actor 发出的状态(或 快照)。
const actor = createActor(feedbackMachine);
actor.subscribe((snapshot) => {
console.log(snapshot);
// logs the current snapshot state, e.g.:
// { value: 'question', ... }
// { value: 'thanks', ... }
});
actor.start();
console.log(actor.getSnapshot());
// logs { value: 'question', ... }
状态值
具有嵌套状态(或_状态图_)的状态机是一个树状结构,其中每个节点都是一个_状态节点_。根状态节点是表示整个机器的顶级状态节点。根节点可以有子状态节点,子状态节点也可以有子状态节点,依此类推。
状态值是一个表示机器中所有活动状态节点的对象。对于没有子状态节点的状态机,状态值是一个字符串:
即将推出…一个视觉示例。
state.value === 'question'
state.value === 'thanks'
state.value === 'closed'
对于具有父状态节点的状态机,状态值是一个对象:
即将推出…一个视觉示例。
state.value === { form: 'invalid' }
- 这表示一个状态机,其活动子节点的键为form
,且其活动子节点的键为invalid
对于具有并行状态节点的状态机,状态值包含具有多个键的对象,每个键表示一个状态节点区域:
state.value ===
{
monitor: 'on',
mode: 'dark',
};
状态机也可能只有根状态节点而没有其他状态节点。对于这些状态机,状态值为 null
。
状态上下文
状态机可以具有上下文,这是一个表示机器扩展状态的对象。上下文是不可变的,只能通过在动作中分配来更新。您可以读取 state.context
属性以获取当前上下文。
const currentState = feedbackActor.getSnapshot();
console.log(currentState.context);
// logs { feedback: '' }
- 如果在机器配置中未指定上下文,则对象为空
{}
(默认) - 切勿修改此对象;应将其视为不可变/只读