问题标签 [xstate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1063 浏览

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

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

状态图代表一个中等复杂的 UI。

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

SelectionStatus, 表示选择项,区分子状态SelectedNone, SelectedOne, SelectedMany.

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

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

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

用于描述事件的动作和条件的 xstate 语法将是:

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

我已经考虑重组状态图以将两个操作分支作为选择分支的子状态,但这似乎比问题更糟糕。

我也考虑过使用像RemovingOneand这样的中间虚拟状态,RemovingMany它只会触发返回到 的转换Idle,但我对它不太满意。

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

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

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

谢谢!

0 投票
2 回答
536 浏览

javascript - 如何获得分层 xstate 机的初始状态?

假设我们有以下简化的分层xstate机器......

...获得其初始状态的最佳方法是什么?

请注意,HFSM.initial返回我'init'而不是{init: 'leaf'}

0 投票
3 回答
25383 浏览

javascript - redux 和状态机(例如 xstate)之间的实际区别是什么?

我正在研究一种中等复杂度的前端应用程序。目前它是用纯 javascript 编写的,它有很多不同的基于事件的消息连接这个应用程序的几个主要部分。

我们决定在进一步重构的范围内为此应用程序实现某种状态容器。以前我有一些使用 redux 和 ngrx store 的经验(实际上遵循相同的原则)。

Redux对我们来说是一种选择,但其中一位开发人员建议使用基于状态机的库,特别是xstate 库

我从未使用过 xstate,所以我发现它很有趣,并开始阅读文档并查看不同的示例。看起来很有前途和强大,但在某些时候我明白我没有看到它和 redux 之间有任何显着差异。

我花了几个小时试图找到答案,或者比较 xstate 和 redux 的任何其他信息。我没有找到任何明确的信息,除了一些文章,如“从 redux 到状态机” ,或者专注于同时使用 redux 和 xstate 的库的链接(很奇怪)。

如果有人可以描述差异或告诉我开发人员何时应该选择 xstate - 欢迎您。

0 投票
1 回答
1345 浏览

reactjs - 在 xState 操作中设置上下文并触发方法

我有一个处理输入表单的简单状态机

我希望该submitComment动作触发一个函数,然后在上下文中重置一个字段,如下所示:

这行不通。

它会触发我传入的方法,但不会使其进入分配位。

我可以在一个动作中做两件事还是应该创建两个单独的动作?

0 投票
1 回答
971 浏览

xstate - 在 xState 中将事件从一台机器发送到另一台机器时传递值

我有一个调用 todoMachine 的简单聊天机器。todoMachine 有一个名为“OPENED_TASK_LIST_CREATOR”的事件,我想从 chatMachine 调用它。我已经设法弄清楚了。

我遇到的问题是我想与“OPENED_TASK_LIST_CREATOR”事件一起发送一个值。即我要打开的列表ID。我已经设法(ctx, e) => console.log('e.payload', e.payload),在发送操作上方记录了它COMMENT_STARRED

有没有办法传递e.payloadsend('OPENED_TASK_LIST_CREATOR', { to: 'todo' })我可以使用 todoMachine 中的值?

0 投票
1 回答
57 浏览

javascript - 使用上下文的问题

我正在努力理解为什么使用 assign 设置 Context 并不总是有效。我有一个非常简单的应用程序,您可以在这里找到https://codesandbox.io/embed/y0xk1mo9x9

我有这样的背景:

由这些功能更新:

decrementNextSelectItem(与事件 UP_KEY 绑定 - 按向上箭头)和incrementNextSelectItem(与事件 DOWN_KEY 绑定 - 按向下箭头)被正确调用:

但是updateCurrentSelectedItem(与事件 OK_KEY 绑定 - 按 'o' 键)神秘地无法按预期工作:

有什么理由吗?我快疯了。

0 投票
1 回答
41 浏览

javascript - 使用发送内置操作

我不明白“发送”内置操作的含义和用法。你可以在这里看到https://codesandbox.io/embed/7467qk4rox一个非常简单的例子,一台机器有两个并行的状态节点;第二个使用 send 内置动作发送事件,但这个动作似乎没有被捕获,在第一个状态节点中也没有,在第二个状态节点中也没有。

你能帮忙吗?

0 投票
1 回答
72 浏览

xstate - 我可以在 xstate 的不同状态下有不同的值吗

我有很多这样的代码:

我想知道是否可以使用 xstate 来清理它?我可以有 3 个状态

到目前为止,我有这个:

但是价值在哪里呢?我会把它们放在上下文中吗?

0 投票
1 回答
2427 浏览

node.js - XState:等待调用函数的响应

我计划在我的应用程序后端使用 XState 来管理状态。调用 api 时,将在成功更改状态时调用函数。函数调用的结果必须作为 api 的响应返回。

我希望将其输出getUserFriends作为我的 api 的响应发送。如何等待转换和所有调用完成?

0 投票
1 回答
97 浏览

typescript - typescript - 如何在特定位置扩展接口(扩展库 xstate 的基本状态)

我希望能够在一个或多个特定位置扩展基本接口。这个想法是能够为库 xstate 定义一个基本状态,可以将其扩展用于更具体的目的。

我有

我想知道打字稿是否可以在特定位置扩展基本接口。例如“空闲”属性

所以结果是

我知道我可以像这样在 Typescript 中定义 Generic

但我希望能够为状态“空闲”(例如)定义特定的基本属性,而不是每次都完全实现它。