问题描述
这是我第一次使用状态机,对我在实现主题时可以定义的可能状态感到有些困惑。 附言(这个问题是关于如何从问题中推断状态,而不是关于如何在代码中实际实现它。我知道并使用过 xstate lib)。
我想出的状态是
例如,在默认状态下,用户还没有输入任何数据,所以逻辑上它是无效状态。
但我们不想在打开表单后立即向用户显示错误(那会很糟糕,对吧?)
这样对吗? 是否可以进一步简化或者是否存在我遗漏的状态?
其次,似乎有任意状态 喜欢
- 验证
- 提交
这些也应该处于混合状态吗? 不过对我来说,它们看起来像是状态。
最后,我们可以说
百万美元的问题,
- 我是否正在考虑以这种方式实施验证的正确方向?
- 是否有任何我遗漏或过度的状态?
解决方法
您可能已经解决了这个问题,但以防万一其他人遇到这个问题并且可以使用一些指针 - 我发现诀窍是要记住,即使是简单的元素通常也有多个并行状态,例如可以禁用按钮并同时显示加载微调器,可以打开菜单并获取数据,头像可以显示占位符并同时获取图像等。
对于你的例子,我会这样看:
字段级别
如果从密码字段的角度考虑,它实际上同时具有多个并行状态:
- 互动
- 有效性
- 可见性
三个状态同时存在,并且有多个子状态
互动
这可能应该反映默认输入事件并具有匹配的状态事件(例如 onChange -> 设置为已更改):
- 模糊
- 专注
- 改变了
- ...
有效性
可能只有两种状态,如果您需要异步验证(例如,如果您需要检查电子邮件是否已存在),则可能是三种状态。对于您只需使用的密码字段:
- 有效
- 无效
- 验证(可选)
可见性
直接:
- 可见
- 隐藏
表单级别
您可能最终会得到两个主要状态和多个子状态:
- 表格
- 错误
表格
- 空闲
- 编辑
- 验证
- 提交
错误
这可以转化为您在例如时显示的警报。帐户已存在或无法验证登录详细信息:
- 无效
- 活跃
您的表单状态机将基本上处理输入、验证、提交和表单错误,并将状态传达给各个现场机器(现场错误消息等)。或者,您可以将验证规则传递给现场机器,它们可以对即更改事件执行现场级验证。可见性之类的事情与表单无关,因此您可以在字段状态机中管理状态。
我认为您在正确的轨道上,您只是想得太有顺序了,而没有考虑并行状态。只需退后一步,查看表单并从 UI 的角度考虑其中可能发生的所有变化。