MODULE 08 / LESSON 01
把界面当成状态机
补齐加载、空、失败、成功、禁用与部分完成。
先理解这个概念
每个有数据或操作的界面都存在状态。状态之间的转移需要原因和反馈。空数据、无搜索结果、没有权限与加载失败看起来都可能“什么也没有”,但用户下一步完全不同。
状态不是给页面多画几张图,而是限定什么情况下允许什么动作。多个布尔值容易组合出不合理界面,例如同时成功、失败且加载中。将互斥状态写清,再为每次事件指定转移和数据保存规则,界面就更容易与真实业务一致。
用判别联合描述状态,比多个互相冲突的布尔值更容易检查。
记住这三个原则
- 01
为每个状态写出可见内容和可执行动作。
- 02
区分初次加载与已有数据的后台刷新。
- 03
失败时明确是保留旧数据、重试还是重新开始。
实际设计时,分三步做
- STEP 01
列出空闲、编辑、提交中、成功和失败等互斥状态,另外区分数据是否存在、权限是否足够等独立条件。
- STEP 02
为每个状态列可用动作、可见反馈和保留数据,说明点击后进入哪里以及什么事件结束等待。
- STEP 03
检查重复提交、晚到响应和切换对象,确保旧请求不能覆盖用户刚打开的新对象。
一个容易理解的例子
请求失败后只剩一个空白区域,用户不知道是否仍在加载。
保留已展示内容并说明刷新失败,提供重试与最后更新时间。
反馈帮助用户判断系统是否可靠以及接下来怎么做。
type ViewState =
| { status: "idle" }
| { status: "loading" }
| { status: "success"; data: Item[] }
| { status: "error"; message: string };展开看:从场景到设计决定
搜索框先输入 A 再输入 B,A 请求却最后返回。如果界面直接展示最后到达的响应,搜索词是 B 而结果属于 A。可以用请求标识或取消机制保证只提交当前查询结果。加载时保留旧结果也可以,但需说明正在更新,不能让用户误以为它已对应新条件。状态设计必须包含数据与查询的对应关系。
适用边界与取舍
状态越多不一定越清楚。不要把每个视觉细节都变成顶层状态,应区分业务状态与局部呈现,避免组合爆炸。
把这个原则用一次
先做一个小判断
为文件上传写出最少的状态集合。
再完成一份设计练习
为“保存笔记”列状态与事件,包含自动保存、断网和用户继续输入。
骨架屏应接近最终布局,不能为了动画让页面一直处于不明进度的等待。
继续查阅
本课为原创教学解释。具体平台规则与标准可查阅官方资料。
WAI-ARIA Authoring PracticesMaterial Design 3