gpt4 book ai didi

statechart - Xstate:导致相同状态的不同 Action 和守卫

转载 作者:行者123 更新时间:2023-12-02 09:13:15 28 4
gpt4 key购买 nike

我正在使用 xstate 库编写状态图。

状态图表示中等复杂的 UI。

我有几个并行状态,但对于这个问题,我们只考虑两个:

SelectionStatus,表示选择项,区分子状态 SelectedNoneSelectedOneSelectedMany .

Operation,表示当前正在进行的操作。它有一个名为 Idle 的子状态(当然还有其他一些)。

有些事件会触发循环回到 Idle 子状态的 Action ,而不会转到另一个状态。让我们将它们视为即时操作,例如一个 removeSelected 操作,它只是删除所选项目(这就是问题的重点)。

如果选择仅限于单个项目(实际上是树中的一个节点)或多个项目(树的一个分支),我将向事件 removeSelected 添加条件以执行不同的操作。

描述事件的 Action 和条件的 xstate 语法将是:

removeSelected: {
Idle: {
cond: isSelectedOneGuard,
actions: ['removeOne']
},
Idle: {
cond: isSelectedManyGuard,
actions: ['removeMany']
}
}

问题是我在同一对象嵌套级别编写了两个 Idle 键,这是无效的。

我考虑过重组状态图,将两个操作分支作为所选操作的子状态,但这似乎是一种比问题更糟糕的解决方法。

我还考虑过使用中间虚拟状态,例如 RemovingOneRemovingMany,它们只会触发返回到 Idle 的转换,但我我对此不太满意。

我可以通过删除保护条件来解决这个问题,在通用的 removeOneOrMany 操作处理程序中进行测试,但我会在状态图中丢失有关不同处理的信息。

有人遇到过类似的问题,可以提供一些建议吗?

(注意:这里指的是xstate的当前版本,3.1.1,3.2也差不多了,不知道能不能更方便的处理这种情况)

谢谢!

最佳答案

使用当前语法 (3.1),您可以将不同的“候选转换”放在一个数组中:

removeSelected: [
{
target: 'Idle',
cond: isSelectedOneGuard,
actions: ['removeOne']
},
{
target: 'Idle',
cond: isSelectedManyGuard,
actions: ['removeMany']
}
]

关于statechart - Xstate:导致相同状态的不同 Action 和守卫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49778778/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com