我正在用 xstate 库编写状态图。
状态图代表一个中等复杂的 UI。
我有几个平行的状态,但对于这个问题,让我们只考虑两个:
SelectionStatus,代表选择项,区分子状态SelectedNone,SelectedOne,SelectedMany。
Operation,代表当前正在进行的操作。它有一个名为Idle(当然还有其他一些)的子状态。
有一些事件会触发循环回到Idle子状态的动作,而不会转到另一个状态。让我们将它们视为即时操作,例如removeSelected仅删除所选项目的操作(这就是问题的重点)。
removeSelected如果选择仅限于单个项目(实际上是树中的一个节点)或多个(树的一个分支),我将向事件添加条件以执行不同的操作。
用于描述事件的操作和条件的 xstate 语法将是:
removeSelected: {
Idle: {
cond: isSelectedOneGuard,
actions: ['removeOne']
},
Idle: {
cond: isSelectedManyGuard,
actions: ['removeMany']
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我Idle在同一对象嵌套级别编写了两个键,这是无效的。
我已经考虑过重构状态图以将两个操作分支作为选择分支的子状态,但这似乎是一种比问题更糟糕的治疗方法。
我还考虑过使用中间虚拟状态,比如RemovingOne和RemovingMany,这只会触发返回到 的转换Idle,但我对此并不满意。
我可以通过删除保护条件来解决这个问题,在通用removeOneOrMany操作处理程序中进行测试,但是我会在状态图中丢失有关不同处理的信息。
任何人都遇到过类似的问题,可以就此提供一些建议吗?
(注意:这是指当前版本的 xstate,即 3.1.1,3.2 快到了,我不知道是否可以更轻松地处理这种情况)
谢谢!
使用当前语法 (3.1),您可以将不同的“候选转换”放在一个数组中:
removeSelected: [
{
target: 'Idle',
cond: isSelectedOneGuard,
actions: ['removeOne']
},
{
target: 'Idle',
cond: isSelectedManyGuard,
actions: ['removeMany']
}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |