G3.09.2sort-filter independence设计研究

排序与筛选是独立操作,不应互相重置

别名: 排序筛选互不重置 · orthogonal sort filter · 约束独立

概念解释

排序改的是同一集合里的次序,筛选改的是集合的成员。两件事正交:不应互相重置。改「按时间」不该把已经勾上的「仅看未读」清掉;再勾一枚筛选也不该把排序弹回默认。用户把它们当成可以叠在一起的两层约束,任何一层被另一层偷偷清零,叠层的劳动就作废。Hearst 把 sort 与 facet 写成可以同时在场的控制,前提正是彼此不擦掉对方的状态。

独立说的是同一次查看里的状态机,不是跨页返回后要不要恢复——那是另一层导航状态。这里只要求:在结果页上动其中一个,另一个还在。

机制

查找过程是叠约束。筛选先把集合收成「未读的工单」,排序再把这个子集按更新时间排。实现上若排序变化会重跑一次「新查询」,而新查询的初始化把筛选设回空,叠层在技术上被建模成了互斥模式。人无法从控件标签预见到这种互斥:两个控件都还在,只是其中一个的值被清了,发现要等到列表突然变长或变乱。

重置还有方向不对称。筛选变化时有人会以为「集合变了,排序该回到相关」,于是主动把排序弹回默认。这对正在用时间排查的人是一次上下文丢失:他要的正好是「这个子集里最新的」。默认排序不是中立的,把它当作筛选之后的礼物送回去,等于否定刚才对次序的选择。两条控制线应像两条独立的状态:查询、筛选、排序,改一条,另两条保持。

怎么研究

构造必须同时用到筛选和排序的任务,看改其中一个时另一个是否还在。

  • 范式:已知项落在「某筛选 × 某非默认排序」的交叉里,先设好两层再故意改其中一层,记录另一层是否被清;日志中「改排序后筛选芯片消失」或「加筛选后 sort 参数回到 default」的事件。Hearst 的 SUI 把两类控制当作可叠加的。
  • 自变量:改排序是否重建查询、改筛选是否重设 sort 参数、URL 是否分别编码两层。
  • 因变量:被意外重置的次数、重做被清那一层的时间、放弃叠加的比例。
  • 方法论注意点:任务若只需一层,测不到冲突。要用「未读里最新的那条」这种必须叠层的金标准。移动端「应用筛选」常整页刷新,刷新后的默认化会被当成功能而不是缺陷,要在协议里把「保持排序」写成预期。

边界

某些排序在筛选后变得无意义(按「距离」排但筛选已把地点锁成唯一),可以提示并建议改排序,而不应静默清掉筛选。切换到另一种结果类型(从商品切到店铺)时两层约束可能都不再适用,这是范围切换,应明示「筛选和排序已按新类型重置」,不要装作还在同一集合上独立。查询词被用户自己清空时,筛选与排序跟谁走是产品选择,但默认仍宜保持,除非集合已经换成另一个。强制重置若发生,必须可撤销。

怎么落地

  • 把查询、筛选、排序做成三个独立参数;任一参数变化只重算列表,不初始化另外两个。
  • URL 或会话状态分别编码两层,刷新、分享、回退时各自还原。
  • 若实现上必须整页重载,重载后读回重载前的筛选芯片和排序选项,不要走默认初始化。
  • 验证:勾两枚筛选,改成非默认排序,再改排序一次、再加一枚筛选。任何一步让芯片消失或排序跳回默认,两层没有独立。把这一页发出去或刷新,两层都应还在。

延伸

  • 同组G3.09.1 当前排序方式需可见 · G3.09.3 默认排序的选择影响绝大多数用户
  • 相邻G3.08 筛选器 · G3.05 结果排序 · G4.03 状态保持
  • 站内检索sort control · filter state · orthogonal controls

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/G3.09.2