Skip to content

转换演员

转换演员是其逻辑由状态转换函数表示的演员,这个函数在给定以下条件下返回演员的下一个状态

  • 演员的当前状态
  • 触发转换的事件

这与像 Redux 这样的库中的_减少函数_非常相似。

转换演员的能力

能力备注
接收事件转换演员接收事件以修改其状态。
发送事件转换演员可以向其引用的其他演员发送事件,例如那些在其input中提供的事件。请注意,这样做是不纯的。
生成演员转换演员目前不能生成新演员。
输入您可以向转换演员提供input
输出转换演员目前不产生输出——它们会无限期地活动,直到它们被停止或发生错误。

转换演员逻辑

您可以使用fromTransition(...)演员逻辑创建器定义转换演员逻辑,该创建器接受两个参数:

  • 返回演员下一个状态的状态转换函数
  • 演员的初始状态

演员逻辑创建器返回可用于创建转换演员的演员逻辑。

import { fromTransition, createActor } from 'xstate';

const countLogic = fromTransition((state, event) => {
switch (event.type) {
case 'increment': {
return { count: state.count + 1 };
}
case 'decrement': {
return { count: state.count - 1 };
}
default: {
return state;
}
}
}, { count: 0 }); // 初始状态

const countActor = createActor(countLogic);
countActor.subscribe(snapshot => {
console.log(snapshot.context);
});
countActor.start();
// logs { count: 0 }

countActor.send({ type: 'increment' });
// logs { count: 1 }

countActor.send({ type: 'decrement' });
// logs { count: 0 }

转换演员输入

您可以向转换演员提供input,它将传递给解析初始状态的函数。

import { fromTransition, createActor } from 'xstate';

const countLogic = fromTransition((state, event) => {
// ...
}, ({ input }: { input: number }) => ({
count: input // Initial state
}));

const countActor = createActor(countLogic, {
input: 42
});

countActor.subscribe(snapshot => {
console.log(snapshot.context);
// logs { count: 42 }
});

countActor.start();