R1.03.4state transition failure设计

状态之间的转换比状态本身更易出错

别名: 状态转换 · 状态机路径 · enter leave hooks

概念解释

状态表里的每一格都是快照,用户经历的是格子之间的路。焦点还在按钮上时请求开始,加载结束是成功还是失败、焦点还在不在、中间会不会闪出空态——这些都不在快照里。状态转换失败(state transition failure)比缺某一格更常见,因为路径上要决定保留什么、播报什么、能不能退回。

目录画全了、箭头没画,运行时照样会断。要盯的是边,不是点。

机制

快照可以独立评审:把禁用放在画板上一眼能看完。转换是带时间和因果的:谁触发、耗时多久、哪些属性必须保持、失败走哪条边。焦点、滚动位置、已输入的文本、屏幕阅读器的读到哪里,都是路径上的行李;默认实现往往在进入加载时卸载整棵子树,行李落地,回来时用户要重新找控件。空态若被当成加载和数据之间的必经帧,成功路径会闪一下「没有内容」,像故障。

错误恢复是最容易没边的:失败之后是留在错误上直到重试,还是静默回到默认?两条边的产品含义完全不同,但状态目录里可能都有「错误」这一格,看起来像齐了。齐的是点,缺的是边。

边界

没有异步、没有跨帧过程的纯 CSS 悬停,转换就是进入和离开,不必单独立项。游戏或可视化里每帧都在变的连续量,不是离散状态机,硬画边会假。路由级卸载(离开整个页面)由页面生命周期承接,组件内部转换管不到;但组件若在页面内被条件卸载,仍要规定卸载前焦点交给谁。动效时长本身不是转换规格,时长两端的状态承诺才是。

怎么落地

  • 在状态表旁边画允许的边:从哪一格可以到哪一格,非法边(空 → 按下)明确禁止。
  • 为每条异步边写下进入时保留什么(焦点、输入、滚动)以及离开时向辅助技术播报什么。
  • 用慢网和失败注入把主按钮从默认走到加载再分叉到成功与错误,录下焦点是否还在、是否闪空。
  • 验证:对照录屏,每一条实际发生的边都能在图上找到,且行李(焦点、输入)按承诺保留。多出来的闪空或丢焦,就是有快照、没有转换。

延伸

  • 同组R1.03.1 每个组件都需定义全部交互状态 · R1.03.2 加载、空、错误状态最常缺失 · R1.03.3 状态缺失会在实现阶段被随意补齐 · R1.03.5 状态可叠加,组合态需要优先级规则 · R1.03.6 状态需在组件外可被驱动与观察
  • 相邻R3.02 焦点管理 · R3.05 渲染阻塞与布局抖动
  • 站内检索state transition failure · state machine · focus restoration

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R1.03.4