MODULE 08 / LESSON 01

把界面当成状态机

补齐加载、空、失败、成功、禁用与部分完成。

29 / 60 课组织界面与交互含互动实验

先理解这个概念

每个有数据或操作的界面都存在状态。状态之间的转移需要原因和反馈。空数据、无搜索结果、没有权限与加载失败看起来都可能“什么也没有”,但用户下一步完全不同。

状态不是给页面多画几张图,而是限定什么情况下允许什么动作。多个布尔值容易组合出不合理界面,例如同时成功、失败且加载中。将互斥状态写清,再为每次事件指定转移和数据保存规则,界面就更容易与真实业务一致。

用程序员的语言说

用判别联合描述状态,比多个互相冲突的布尔值更容易检查。

记住这三个原则

  1. 01

    为每个状态写出可见内容和可执行动作。

  2. 02

    区分初次加载与已有数据的后台刷新。

  3. 03

    失败时明确是保留旧数据、重试还是重新开始。

实际设计时,分三步做

  1. STEP 01

    列出空闲、编辑、提交中、成功和失败等互斥状态,另外区分数据是否存在、权限是否足够等独立条件。

  2. STEP 02

    为每个状态列可用动作、可见反馈和保留数据,说明点击后进入哪里以及什么事件结束等待。

  3. STEP 03

    检查重复提交、晚到响应和切换对象,确保旧请求不能覆盖用户刚打开的新对象。

一个容易理解的例子

BEFORE / 常见问题

请求失败后只剩一个空白区域,用户不知道是否仍在加载。

AFTER / 可以这样改

保留已展示内容并说明刷新失败,提供重试与最后更新时间。

反馈帮助用户判断系统是否可靠以及接下来怎么做。

IMPLEMENTATION NOTE
type ViewState =
  | { status: "idle" }
  | { status: "loading" }
  | { status: "success"; data: Item[] }
  | { status: "error"; message: string };

展开看:从场景到设计决定

搜索框先输入 A 再输入 B,A 请求却最后返回。如果界面直接展示最后到达的响应,搜索词是 B 而结果属于 A。可以用请求标识或取消机制保证只提交当前查询结果。加载时保留旧结果也可以,但需说明正在更新,不能让用户误以为它已对应新条件。状态设计必须包含数据与查询的对应关系。

适用边界与取舍

状态越多不一定越清楚。不要把每个视觉细节都变成顶层状态,应区分业务状态与局部呈现,避免组合爆炸。

YOUR TURN

把这个原则用一次

先做一个小判断

为文件上传写出最少的状态集合。

再完成一份设计练习

为“保存笔记”列状态与事件,包含自动保存、断网和用户继续输入。

容易踩的坑

骨架屏应接近最终布局,不能为了动画让页面一直处于不明进度的等待。

继续查阅

本课为原创教学解释。具体平台规则与标准可查阅官方资料。

WAI-ARIA Authoring PracticesMaterial Design 3