Figma 复杂筛选器与查询构建器系统(Query Builder & Advanced Filter Architecture)组件架构实战:从 AND/OR 嵌套逻辑树、动态条件行(Field/Operator/Value)、标签折叠胶囊到 Dev Mode 前端 JSON DSL 代码交付
在企业级中后台系统、数据智能分析看板(BI Dashboard)、安全合规与操作审计中心、以及大型 CRM/ERP 客户细分等重度数据型应用中,面对数十甚至上百个交叉维度的多维条件检索,传统的单一关键词搜索框(Global Search)与轻量下拉筛选栏(Filter Bar)完全无法满足复杂业务需求。
此时,复杂筛选器与可视化查询构建器(Query Builder / Advanced Filter) 成为了产品中承载高阶数据过滤的中枢物料。
然而,在日常 UI/UX 设计与前端协作中,查询构建器也是最容易引发“组件架构灾难”的重灾区:
- 嵌套逻辑树排版混乱:当用户创建多层
AND(且)与OR(或)组合嵌套分支时,传统的非 Auto Layout 绘制方式会导致连接导轨断裂错位,无法自适应增删行; - 三元组输入控件形态失控:条件行内部由 字段(Field)、运算符(Operator) 与 取值(Value) 组成,若未建立插槽解耦机制,面对文本输入、数值区间、枚举多选、日期时间选择器等不同控件时,变体数量将呈指数级爆炸;
- 筛选结果缺乏可视化汇总:复杂查询构建后,若收起弹窗,主界面未提供清晰的已选标签胶囊(Filter Chips)与溢出折叠(+N More),导致用户完全失去当前数据视图的上下文感知;
- 研发交付严重脱节:前端工程师需要将视觉组件映射为结构化的抽象语法树(AST)或 JSON 查询 DSL,若设计稿未提供明确的字段类型定义与数据结构契约,前后端联调成本将极度高昂。
本文将系统拆解从递归分支树拓扑、三元组插槽设计、Auto Layout Wrap 胶囊排版、Variables 变量联动到 Dev Mode 现代前端 AST 代码交付的完整实战指南。
企业级筛选交互组件全维横评 #
在启动组件设计前,必须根据数据维度复杂度与目标用户群体的专业度,评估选用最合适的筛选交互形态:
| 评估维度 | 简单内联筛选栏 (Inline Filter Bar) | 气泡下拉复合筛选 (Popover Filter Group) | 树状可视化查询构建器 (Visual Query Builder) |
|---|---|---|---|
| 逻辑运算支持 | 仅隐式支持全 AND(单条件并列) | 多数仅支持单字段独立并列 | 完整支持多层 AND / OR 嵌套逻辑树 |
| 条件行数量 | 极少(通常 3~5 个常用预设字段) | 中等(支持勾选添加更多常用维度) | 无上限动态增删(支持无限条件行与分支组) |
| 取值类型复杂度 | 简单下拉单选、单文本搜索 | 下拉多选、单日期、数值区间 | 跨类型全覆盖(枚举、跨表关联、动态函数、相对时间范围) |
| 空间占用尺寸 | 页面表格上方单行水平平铺 | 独立卡片气泡弹窗(宽度约 320px) | 沉浸式专用面板(宽度 640px~960px 或全屏抽屉) |
| 典型代表场景 | 移动端电商订单列表、简易待办看板 | 通用 SaaS 表格、敏捷项目管理看板 | 大数据 SQL 查询、安全态势告警中心、CRM 精准营销分群 |
查询构建器四层拓扑架构 #
一个鲁棒且能够无限嵌套的查询构建器组件,严格遵循四层 Auto Layout 自动布局 容器嵌套架构:
┌────────────────────────────────────────────────────────────────────────┐
│ Level 1: Query Builder Root Container 根构建器容器 (Hug / Fill) │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Level 2: Logical Branch Group 逻辑分支组 (垂直 Auto Layout) │ │
│ │ ┌──────────────┐ │ │
│ │ │ [AND] [OR] │ ◄── 逻辑分段切换器 (Segmented Combinator) │ │
│ │ └──────┬───────┘ │ │
│ │ │ │ │
│ │ ┌─────┴──────────────────────────────────────────────────────┐ │ │
│ │ │ Level 3: Condition Row 条件行 1 │ │ │
│ │ ├─┤ [Field: 注册时间 ▼] [Operator: 在区间内 ▼] [Value: 近7天 ▼] [✕] │ │ │
│ │ │ └────────────────────────────────────────────────────────────┘ │ │
│ │ │ ┌────────────────────────────────────────────────────────────┐ │ │
│ │ │ │ Level 3: Condition Row 条件行 2 │ │ │
│ │ ├─┤ [Field: 累计消费 ▼] [Operator: 大于等于 ▼] [Value: ¥5000 ] [✕] │ │ │
│ │ │ └────────────────────────────────────────────────────────────┘ │ │
│ │ │ ┌────────────────────────────────────────────────────────────┐ │ │
│ │ │ │ Level 2: Sub-Group 嵌套子分支 (递归嵌套) │ │ │
│ │ └─┤ ┌──────────┐ │ │ │
│ │ │ │[AND] [OR]│ ◄── 子逻辑切换器 │ │ │
│ │ │ └────┬─────┘ │ │ │
│ │ │ ┌─┴────────────────────────────────────────┐ │ │ │
│ │ │ │ [Field: 会员等级 ▼] [Operator: 属于 ▼]... │ │ │ │
│ │ │ └──────────────────────────────────────────┘ │ │ │
│ │ └────────────────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────────────────┐ │ │
│ │ │ Level 4: Action Footer 动作栏 [+ 添加条件] [+ 添加条件组] [清空]│ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────┘
1. Level 1: Query Builder Root Container(根容器) #
- 布局属性:垂直 Auto Layout,内边距统一设为
16px,间距设为12px; - 尺寸规则:宽度设为 Fill container 或固定
800px,高度设为 Hug contents; - 视觉层级:圆角
8px,背景为浅色次级表面(surface/subtle),描边1px。
2. Level 2: Logical Branch Group(逻辑分支组) #
- 左侧导轨与分段器:左侧放置一个微型垂直分段控制器(Tabs & Segmented Control),宽度
48px,内含AND(且)与OR(或)两个选项; - 垂直连续连接线(Connector Line):从分段控制器底部向下引出一条物理
2px宽度的中性浅灰色垂直线,采用 Auto Layout 的 Fill container 属性垂直拉伸,直连至末级条件行的中心; - 子条件集合:右侧包含垂直 Auto Layout 容器,容纳所有属于该逻辑组的同级条件行(Condition Rows)。
3. Level 3: Condition Row(原子条件行) #
- 布局属性:水平 Auto Layout,间距设为
8px,对齐方式为居中对齐; - 三元组插槽:
- 字段选择器(Field Selector):宽度固定
160px,下拉菜单展示所有可用数据字段与字段分类图标; - 运算符选择器(Operator Selector):宽度固定
120px,根据左侧字段的数据类型(String/Number/Date/Boolean)动态切换比较符(如“等于”、“包含”、“介于”、“为空”); - 数值录入区(Value Input Slot):宽度设为 Fill container,支持通过组件属性(Component Properties)交换文本框、数字微调器、下拉多选或日期选择器;
- 删除按钮(Remove Action):最右侧放置
28px × 28px微型垃圾桶图标按钮,悬停高亮为危险红色。
- 字段选择器(Field Selector):宽度固定
4. Level 4: Action Bar(控制动作栏) #
- 底部左侧水平排列两个辅助按钮:“+ 添加条件(Add Condition)”与“+ 添加条件组(Add Sub-group)”;
- 底部右侧放置“清空所有条件(Reset)”与“应用筛选(Apply Filter)”双 CTA 操作。
核心交互细节与高保真落地技巧 #
在 Figma 中设计复杂查询构建器时,若忽略以下 3 个细节,组件在研发落地和复杂排版中将极易破损:
[三元组值插槽动态解耦] [L型连接导轨自适应拼接] [已选条件胶囊折叠栏]
┌─────────┬─────────┬─────────┐ │ AND ┌───────────────┐ ┌───────────────────────────────┐
│ Field │Operator │ Value │ ├───┬───┤ Row 1 Condition│ │[VIP会员 ×] [消费>5000 ×] [+3] │
│ [字段] │ [比较] │ [动态值] │ │ │ └───────────────┘ └───────────────────────────────┘
└─────────┴─────────┴─────────┘ │ │ ┌───────────────┐ ▲
▲ ▲ │ └───┤ Row 2 Condition│ └─ Auto Layout Wrap 自动换行
└─ 触发器联动 ────────┘ │ └───────────────┘ 超量自动折叠为 Popover
1. 三元组多态插槽(Slot)的组件属性降维解耦 #
许多设计师试图为“数字比较行”、“文本包含行”、“日期区间行”分别创建庞大的变体,导致组件库变体数突破上千个:
- 正解方案:将 Value 区块抽象为独立的 Component Slot(插槽实例);
- 在主条件行(Condition Row)中,为 Value 区域绑定 Instance swap property(实例交换属性);
- 预先准备 4 个原子级输入插槽组件:
Slot/Value-Text(普通单行输入框)Slot/Value-NumberRange(双数字输入框,中间带波浪号)Slot/Value-SelectMultiple(带标签胶囊的多选下拉框)Slot/Value-DateRange(日期时间范围选择器)
- 无论业务如何扩展,条件行母版始终保持为单个精简组件,通过实例交换即可覆盖 100% 业务输入形态。
2. 嵌套分支 L 型与 T 型连接导轨(Connector Lines)防断裂技巧 #
在多层嵌套中,连接线若由散落在外的绝对定位矢量组成,增减一行时所有线条都会错位断裂:
- 无缝导轨方案:为每一个 Condition Row 内部左侧预留一个
24px × 40px的 Frame 作为“导轨插槽”; - 内部由两条物理矩形构成:一条从顶部贯穿至底部的垂直中心线(高度 100% Fill),一条从中心横向延伸至右侧的水平线(宽度 12px);
- 对于第一行、中间行和最后一行,通过布尔属性控制垂直线下方半截的显隐,使得最后一行自然形成完美的“L 型拐弯”,中间行形成“T 型连接”;
- 整个逻辑树无论动态增加 5 行还是 20 行,Auto Layout 自动驱动导轨纵向生长,永远不会出现断线或露白。
3. 主界面已选条件标签栏(Filter Chips Bar)与 Wrap 自动换行 #
查询构建器通常以弹窗或抽屉形式出现,而在主表格上方,必须呈现压缩态的已选条件汇总:
- 采用 Auto Layout 自动换行(Wrap) 容器排布筛选标签胶囊(Tag Chips);
- 每个胶囊内嵌字段名、运算符与当前值(如
注册时间: 近7天 ✕),点击尾部叉号可单项快速移除; - 当标签总宽度超过表格首行时,利用 Auto Layout 结合固定行高截断,在末尾动态展示
+3 更多筛选气泡胶囊,点击后弹出小型 Popover 查看全量规则。
Figma Variables 变量状态机与高保真原型 #
借助 Figma Variables 与条件分支逻辑,可实现点击“+ 添加条件”真实增加一行的高保真交互原型:
[Variables 变量定义清单]
├── ConditionCount (Number 变量,初始值 2)
├── LogicType (String 变量,"AND" 或 "OR")
├── IsRow3Visible (Boolean 变量,初始值 false)
├── IsRow4Visible (Boolean 变量,初始值 false)
└── SelectedFilterSummary (String 变量,"已生效 2 项筛选")
原型连线实战步骤: #
- 控制条件行显隐:在查询面板中预先排好第 3 行与第 4 行条件组件,将它们的 Layer 显隐属性分别绑定到
IsRow3Visible与IsRow4Visible; - “+ 添加条件”点击动作:
- 为底部“+ 添加条件”按钮添加 On click 触发器;
- 增加条件语句(Conditional):
if ConditionCount == 2->Set IsRow3Visible = true且Set ConditionCount = 3;else if ConditionCount == 3->Set IsRow4Visible = true且Set ConditionCount = 4;
- 单行删除点击动作:
- 点击第 3 行的删除图标 ->
Set IsRow3Visible = false且Set ConditionCount = ConditionCount - 1;
- 点击第 3 行的删除图标 ->
- 逻辑切换器连线:
- 点击
OR选项 ->Set LogicType = "OR",左侧导轨标签文字同步变为“或”,所有分支连接线颜色同步高亮微调。
- 点击
Dev Mode 现代前端工程交付标准 #
在 Dev Mode 开发模式 下,向研发团队交付查询构建器组件时,最核心的不是导出一堆 HTML 标签,而是提供标准化、类型安全的 JSON 查询抽象语法树(AST DSL)规范。
1. 工业级前端开源库映射 #
目前 Web 前端最通用、最成熟的开源标准是 react-querybuilder 以及各大企业级组件库(Ant Design Pro QueryFilter、Element Plus):
import { useState } from 'react';
import { QueryBuilder, RuleGroupType } from 'react-querybuilder';
import 'react-querybuilder/dist/query-builder.css';
// 定义可用字段元数据契约
const fields = [
{ name: 'username', label: '用户名称', inputType: 'text' },
{ name: 'userAge', label: '用户年龄', inputType: 'number' },
{ name: 'role', label: '所属角色', valueEditorType: 'select', values: [
{ name: 'admin', label: '系统管理员' },
{ name: 'developer', label: '开发工程师' },
{ name: 'guest', label: '访客' }
]},
{ name: 'createdAt', label: '创建时间', inputType: 'date' }
];
export function SecurityAuditFilter() {
const [query, setQuery] = useState<RuleGroupType>({
combinator: 'and',
rules: [
{ field: 'role', operator: '=', value: 'admin' },
{ field: 'userAge', operator: '>=', value: 25 }
]
});
return (
<div className="p-4 border rounded-lg bg-card">
<QueryBuilder
fields={fields}
query={query}
onQueryChange={q => setQuery(q)}
controlClassnames={{
queryBuilder: 'custom-query-builder',
ruleGroup: 'bg-muted/30 p-4 rounded-md',
combinators: 'font-bold'
}}
/>
</div>
);
}
2. 标准 JSON 查询 DSL 结构契约(前后端联调基准) #
在设计规范中附带标准 AST JSON 结构,使研发能够直接生成解析引擎:
{
"id": "root-group-001",
"combinator": "and",
"not": false,
"rules": [
{
"id": "rule-001",
"field": "registration_date",
"operator": "between",
"value": ["2026-11-01", "2026-11-08"],
"valueSource": "value"
},
{
"id": "sub-group-002",
"combinator": "or",
"rules": [
{
"id": "rule-002",
"field": "total_spend",
"operator": ">=",
"value": 5000
},
{
"id": "rule-003",
"field": "is_vip",
"operator": "=",
"value": true
}
]
}
]
}
3. W3C WAI-ARIA 无障碍可访问性要求 #
- 分组语义:每个逻辑分支组(Rule Group)必须标注
role="group",并通过aria-label声明当前逻辑关系(如aria-label="AND 筛选条件组"); - 动态更新朗读:当用户点击“+ 添加条件”时,通过
aria-live="polite"区域向视障屏幕阅读器广播“已添加新条件行”; - 键盘导航支持:支持使用
Tab键在字段、运算符、值与删除按钮间顺序跳转,按Delete或Backspace键快速删除当前聚焦的条件行。
有关设计系统全局设计令牌定义与变量命名规范,可进一步参阅 Design Tokens 语义设计令牌速查表 与 Figma 常见报错与疑难故障诊断手册。
核心手册与速查工具
高频手册与实用设计生产力工具直达常见问题与答疑 (FAQ)
高频疑难解析与避坑指南完全不需要。绝大多数核心功能在免费 Starter 计划中均可完整体验与实操练习,无需额外付费购买付费团队版。