R1.03.4state transition failure设计
状态之间的转换比状态本身更易出错
别名: 状态转换 · 状态机路径 · enter leave hooks
概念解释
状态表里的每一格都是快照,用户经历的是格子之间的路。焦点还在按钮上时请求开始,加载结束是成功还是失败、焦点还在不在、中间会不会闪出空态——这些都不在快照里。状态转换失败(state transition failure)比缺某一格更常见,因为路径上要决定保留什么、播报什么、能不能退回。
目录画全了、箭头没画,运行时照样会断。要盯的是边,不是点。
机制
快照可以独立评审:把禁用放在画板上一眼能看完。转换是带时间和因果的:谁触发、耗时多久、哪些属性必须保持、失败走哪条边。焦点、滚动位置、已输入的文本、屏幕阅读器的读到哪里,都是路径上的行李;默认实现往往在进入加载时卸载整棵子树,行李落地,回来时用户要重新找控件。空态若被当成加载和数据之间的必经帧,成功路径会闪一下「没有内容」,像故障。
错误恢复是最容易没边的:失败之后是留在错误上直到重试,还是静默回到默认?两条边的产品含义完全不同,但状态目录里可能都有「错误」这一格,看起来像齐了。齐的是点,缺的是边。
边界
没有异步、没有跨帧过程的纯 CSS 悬停,转换就是进入和离开,不必单独立项。游戏或可视化里每帧都在变的连续量,不是离散状态机,硬画边会假。路由级卸载(离开整个页面)由页面生命周期承接,组件内部转换管不到;但组件若在页面内被条件卸载,仍要规定卸载前焦点交给谁。动效时长本身不是转换规格,时长两端的状态承诺才是。
怎么落地
- 在状态表旁边画允许的边:从哪一格可以到哪一格,非法边(空 → 按下)明确禁止。
- 为每条异步边写下进入时保留什么(焦点、输入、滚动)以及离开时向辅助技术播报什么。
- 用慢网和失败注入把主按钮从默认走到加载再分叉到成功与错误,录下焦点是否还在、是否闪空。
- 验证:对照录屏,每一条实际发生的边都能在图上找到,且行李(焦点、输入)按承诺保留。多出来的闪空或丢焦,就是有快照、没有转换。