如何从 xstate 中的状态获取所有可能的转换
Posted
技术标签:
【中文标题】如何从 xstate 中的状态获取所有可能的转换【英文标题】:How to get all possible transitions from a state in xstate 【发布时间】:2020-03-05 12:23:48 【问题描述】:给定一个 xState fsm,例如 counter 或 search 示例。
如何枚举可能的转换?我试过了
const current = service.state
const stateNode = service.machine
const isActive = !stateNode.parent || current.matches(stateNode.path.join('.')) || undefined
getEdges(<where do I get this node?>, depth: 0 ).reduce((actions, edge)
问题是我不知道将什么作为第一个参数提交给getEdges
。当 fsm 刚开始时,提交stateNode
不会产生任何边。但是,xState VIZ 应用程序清楚地显示了活动状态有转换。
【问题讨论】:
【参考方案1】:我已经玩过@xstate/graph
的部分内容,这个例子与我想要的一样接近:
import Machine from "xstate"
import getShortestPaths from '@xstate/graph'
export const feedbackMachine = Machine(
id: 'feedback',
initial: 'question',
states:
question:
on:
CLICK_GOOD: 'thanks',
CLICK_BAD: 'form',
CLOSE: 'closed',
ESC: 'closed',
REMOVE_ME: 'nope'
,
form:
on:
SUBMIT: 'thanks',
CLOSE: 'closed',
ESC: 'closed'
,
nope:
on:
,
thanks:
on:
CLOSE: 'closed',
ESC: 'closed'
,
closed:
type: 'final'
)
const showPaths = () =>
const paths = getShortestPaths(feedbackMachine)
const states = Object.keys(paths).filter(k => paths[k].weight > 0)
console.log(states)
// [""thanks"", ""form"", ""closed"", ""nope""]
showPaths()
从问题状态的可能转换中删除 REMOVE_ME: 'nope'
后,您应该会看到结果为:[""thanks"", ""form"", ""closed""]
in showPaths
我还看到 getEdges 最近已从 @xstate/graph
中删除,所以我暂时不要使用它。
【讨论】:
以上是关于如何从 xstate 中的状态获取所有可能的转换的主要内容,如果未能解决你的问题,请参考以下文章