Figma 复杂筛选器与查询构建器系统(Query Builder & Advanced Filter Architecture)组件架构实战:从 AND/OR 嵌套逻辑树、动态条件行(Field/Operator/Value)、标签折叠胶囊到 Dev Mode 前端 JSON DSL 代码交付

2026 年 11 月 13 日

在企业级中后台系统、数据智能分析看板(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 微型垃圾桶图标按钮,悬停高亮为危险红色。

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 个原子级输入插槽组件:
    1. Slot/Value-Text(普通单行输入框)
    2. Slot/Value-NumberRange(双数字输入框,中间带波浪号)
    3. Slot/Value-SelectMultiple(带标签胶囊的多选下拉框)
    4. 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 项筛选")

原型连线实战步骤: #

  1. 控制条件行显隐:在查询面板中预先排好第 3 行与第 4 行条件组件,将它们的 Layer 显隐属性分别绑定到 IsRow3Visible 与 IsRow4Visible;
  2. “+ 添加条件”点击动作:
    • 为底部“+ 添加条件”按钮添加 On click 触发器;
    • 增加条件语句(Conditional):
      • if ConditionCount == 2 -> Set IsRow3Visible = true 且 Set ConditionCount = 3;
      • else if ConditionCount == 3 -> Set IsRow4Visible = true 且 Set ConditionCount = 4;
  3. 单行删除点击动作:
    • 点击第 3 行的删除图标 -> Set IsRow3Visible = false 且 Set ConditionCount = ConditionCount - 1;
  4. 逻辑切换器连线:
    • 点击 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)

高频疑难解析与避坑指南
A

完全不需要。绝大多数核心功能在免费 Starter 计划中均可完整体验与实操练习,无需额外付费购买付费团队版。