Insights·2026-10-06

筛选 UI 该用下拉还是标签页 — 标签页只是换了外观的单选按钮

在服务案例卡片列表上方放一个选择全部·A·B·C 的下拉筛选,接近错误答案。那个位置要展示的是这家公司的服务分成 A·B·C,而下拉框把这些选项折叠起来,不点就看不到。一开始就把选项摆在外面,并标出当前正在看什么,更接近正确答案。背后有两份数据。卡片列表是数组里装着多个对象的形状,当前显示哪种类型由一个叫状态的值记住。只能选一个时是单选按钮的逻辑,标签页就是换了外观的单选按钮。

드롭다운은 선택지를 접고 탭은 꺼내 두는 라디오 버튼이다 — 글의 요약 도식

下拉筛选为什么接近错误答案

上一篇整理了课程的一个观点:咨询申请表单,也就是填入数值后一次性提交的表格,只要顺着数值的存储流程去看,就能像数独一样解开。课程接着问:不是表单的地方也有正确答案吗?例子是服务介绍页里的案例区块,也就是页面从上到下分出的区域中,集中展示客户案例的那一块。这家公司卖 A·B·C 三种服务套餐,它们的案例以一排卡片的形式排开。

卡片列表上方有一个筛选。写着「全部」的框右侧带着向下的折角箭头,点开后展开全部·A·B·C。选 B,框里的字变成 B,只剩下 B 的案例。这种要点一下才会展开列表的选择框叫下拉框。很常见,功能也没问题。

课程问:这是正确答案还是错误答案?判断标准是这个区块的意图。案例是一种证言。这个位置的作用,是展示 A·B·C 各自的案例,让访客想要申请咨询。

可是相当多的访客,要到这个区块才第一次知道这家公司的服务分成 A·B·C。即使页面顶部的横幅,也就是大幅宣传图片区域,一张张轮播介绍了 A·B·C,没有滑动、一路往下滚的人也看不到。下拉框又把这三个名字折回框里。不点开,就只看到「全部」一个词。

所以更接近正确答案的做法,是一开始就把选项摆在外面。全部·A·B·C 并排可见,当前正在看什么也有标示。「服务是有区分的」这个区块意图,在点击之前就传达出去了。

形式选项看得见吗看得出当前在看什么吗
下拉框要点开才展开只有框里的一个词
摆在外面的选项一开始就并排可见选中的那个醒目标出

一张卡片里装着的数据

课程在这里又往里走了一步。这些卡片里也藏着数据。案例 1、2、3、4 号卡片,以两种方式之一出现在屏幕上。

一种是把要显示的内容直接写进页面代码。因为把值硬生生钉进代码里,所以叫硬编码。要换案例就得改代码。另一种是显示管理员录入的值。在只有运营者能进入的管理后台登记案例,这些值就进入数据库,也就是像电子表格一样把值堆起来的地方,案例列表再把值取过来随时显示。就像管理员查看咨询申请记录一样,案例通常也走这条路。

取过来的值长什么样?卡片有好几张,所以是列表。按顺序装着多个值的列表叫数组,用方括号开头,用逗号分隔。方括号里依次放着案例 1、2、3、4。

数一数一张卡片需要的值:案例标题、客户公司、图片、日期。「查看详情」按钮每张卡片都一样,所以不是值。图片如果不是固定的,就是值。要在屏幕上显示图片,需要图片存放的地址,所以每张卡片都带一个图片地址。像这样用花括号把一张卡片的值包成的一块,叫对象。

但这还不是全部。按 B 要只剩 B 的案例,所以每张卡片还需要一个值,说明它属于哪种服务,也就是屏幕上看不到的类型值。总结一下,卡片列表的数据是数组里装着多个对象的形状,每个对象里有四个看得见的值和一个看不见的值。

案例卡片列表的数据 — 数组里的对象
[
  {
    title: "案例 1 标题",
    customer: "客户公司 1",
    imageUrl: "/cases/case-1.webp",
    createdAt: "2026-09-01",
    type: "A"          ← 屏幕上不显示
  },
  {
    title: "案例 2 标题",
    customer: "客户公司 2",
    imageUrl: "/cases/case-2.webp",
    createdAt: "2026-09-08",
    type: "B"
  },
  ...
]

方括号 [ ] = 列表(数组),花括号 { } = 一张卡片(对象)

现在显示什么 — 状态

光有数据,页面还没完成。访客按下 B,就得发生只显示 B 案例的动作。为此,页面必须在某处记住自己当前在显示哪种类型。

这份记忆叫状态,英文是 state。它是看不见的、附着在页面一侧的值。用电子表格来比,表里堆着的值是数据,当前挂着的筛选条件接近状态。如果说数据是「有什么」,状态就是「现在显示其中哪些」。

状态值的形状可以从两个方向来想。如果允许同时选多个类型,状态就是列表。全部时 A·B·C 都在数组里;选了 A 和 C,就显示 A 和 C 的案例;三个都选,就又显示全部。这和上一篇咨询表单里的复选框结构相同,也就是保留之前的选择、可以再多选的格子。

反过来,如果按下 B 的瞬间 A 要被取消、只显示 B,并且「全部」不是把 A·B·C 都选上,而是作为单独的一个选项来处理,那么状态就是一个值。选了别的,前一个选择就被取消,这种逻辑就是单选按钮。

课程要求的就是这种思考。看着筛选,先问它是复选框逻辑还是单选按钮逻辑。答案定了,状态的形状就定了;状态的形状定了,要向 AI 提什么要求也就定了。

筛选状态的两种形状
可以选多个时(复选框逻辑)
selectedTypes = ["A", "B", "C"]   → 全部
selectedTypes = ["A", "C"]        → 只有 A 和 C 的案例

只能选一个时(单选按钮逻辑)
selectedType = "all"              → 全部
selectedType = "B"                → 只有 B 的案例

标签页只是换了外观的单选按钮

有一种熟悉的形式,行为和单选按钮逻辑很相似:标签页。全部·A·B·C 并排贴在一起,按下的那个显露在最前面。它也符合前面「把选项摆在外面」的答案。

标签页有两种做法。一种是预先分别做好全部页面和 A·B·C 页面,每次按下就换成对应的页面。另一种是内部和单选按钮完全一样。状态里只保存选中的一个类型,标签页只负责把选中的那个显露到前面,下方的卡片列表在状态每次变化时重新绘制。外表一样,背后不同。

课程的结论是:屏幕上的许多 UI,也就是人看到并点按的界面元素,只要和两种数据联系起来思考,很大程度上就能得出正确答案。一种是录入数据库的数据,另一种是放进状态的数据。

今天可以试的事是:在自己的服务或常用的应用里挑一个筛选或标签页,确认三件事。点击之前选项看得见吗?看得出当前在看什么吗?只能选一个,还是能选多个?如果发现要改的地方,就像下面这样向 AI 提要求。

还剩一个问题:知道什么样的意图有哪些 UI 选项。下一篇讲为什么要知道这些选项的名字,也就是组件的名字,才能把页面准确地传达给 AI。

让 AI 修改筛选时
改之前先给我看两件事。
1) 案例列表数据是什么形状(数组里对象的字段名)
2) 当前选中的筛选用什么值记住(状态的名字和形状)

然后把案例列表上方的下拉筛选改成标签页。
- 全部·A·B·C 一开始就全部可见。
- 一次只能选一个(单选按钮逻辑)。全部是单独的一个选项。
- 当前选中的标签页要醒目标出。
- 卡片列表按每个案例的 type 值筛选。