Skip to content

SearchForm 搜索表单

xy-search-form 用来把中后台列表页里常见的"筛选字段 + 查询 + 重置 + 折叠更多"收成一块稳定区域。

何时使用

  • 需要快速搭建列表页筛选栏,不想手拼表单布局和按钮。
  • 筛选字段较多,需要折叠/展开能力。
  • 需要和 ProTable 的 request 联动,自动触发查询。

何时不使用

  • 只需要简单表单(非筛选场景)时,优先使用 xy-formxy-pro-form
  • 筛选字段少于 3 个且无折叠需求时,直接用 xy-form inline 更轻量。
  • 需要复杂的分步表单时,优先使用 xy-steps-form

与基础组件的关系

SearchForm
├── Form(表单容器)        ← 基于 xy-form,自动 inline 布局
├── FormItem(字段项)      ← 基于 xy-form-item,自动生成 label
├── Input / Select / ...   ← 根据 field.component 自动映射
└── Button(查询/重置)     ← 内置,可自定义文案

核心区别xy-form 是通用表单组件,xy-search-form 专门为筛选栏场景优化了布局、折叠和查询动作。

最佳实践

字段联动

使用 hiddendisabled 的函数写法实现字段联动:

ts
const fields = [
  { prop: 'type', label: '类型', component: 'select', options: typeOptions },
  {
    prop: 'subType',
    label: '子类型',
    component: 'select',
    options: subTypeOptions,
    hidden: (model) => !model.type,
    disabled: (model) => !model.type
  }
]

与 ProTable 联动

推荐将 SearchForm 放在 ProTable 的 search 插槽中,实现自动联动:

vue
<xy-pro-table :columns="columns" :request="fetchData">
  <template #search="{ model }">
    <xy-search-form
      :model="model"
      :fields="searchFields"
      @search="handleSearch"
    />
  </template>
</xy-pro-table>

折叠策略

当筛选字段超过一行时,建议将次要字段标记为 collapsible

ts
const fields = [
  { prop: 'keyword', label: '关键词' },
  { prop: 'status', label: '状态', component: 'select', options: statusOptions },
  { prop: 'dateRange', label: '日期范围', component: 'date-picker', collapsible: true },
  { prop: 'department', label: '部门', component: 'select', collapsible: true, options: deptOptions },
]

基础用法

常见的做法是用 schema 描述字段,让输入框、选择器和按钮顺手落成一条筛选栏。

适合列表页顶部筛选栏。

折叠字段与自定义插槽

当筛选项较多时,可以把次级字段标记为 collapsible,并用具名插槽承接个别特殊字段。

普通输入框按 Enter 会直接触发查询,select 和 textarea 不会。

SearchForm API

SearchForm Attributes

属性说明类型默认值
model表单数据对象Record<string, unknown>
fields字段 schema 数组SearchFormField[][]
rules字段校验规则FormRules{}
columns栅格列数number3
collapsed是否折叠,受控模式booleanundefined
default-collapsed默认是否折叠booleantrue
submit-text查询按钮文案string'查询'
reset-text重置按钮文案string'重置'
submit-on-reset重置后是否再次派发 searchbooleantrue
validate-on-search查询前是否校验字段booleanfalse

SearchForm Events

事件名说明参数
search点击查询或触发主动提交时派发(modelSnapshot) => void
reset点击重置后派发(modelSnapshot) => void
update:collapsed折叠状态变化时派发(value: boolean) => void
collapse-change折叠状态变化时派发(value: boolean) => void

SearchFormField Attributes

属性说明类型默认值
prop字段键名string
label字段标签string
component内置字段类型或自定义组件'input' | 'select' | 'date-picker' | 'time-picker' | 'time-select' | 'input-number' | 'switch' | Component'input'
component-props透传给字段组件的 propsRecord<string, unknown>{}
optionsselect 的选项列表SearchFormFieldOption[][]
slot自定义字段插槽名string跟随 prop
span当前字段跨列数number1
collapsible折叠时是否收起该字段booleanfalse
hidden是否隐藏字段,可传函数boolean | (model) => booleanfalse
disabled是否禁用字段,可传函数boolean | (model) => booleanfalse

SearchForm Slots

插槽说明
meta动作区左侧元信息
actions自定义动作区
[field.slot / field.prop]自定义字段内容

行为约定

  • placeholder 优先级固定为:field.placeholder > field.componentProps.placeholder > 自动生成文案
  • 只有内置 input 且非 textarea 场景,按 Enter 会触发一次 search;其他字段类型不会自动提交。
  • validate-on-search 开启后,search 只有在字段校验通过时才会派发。
  • submit-on-resettrue 时,点击重置会在派发 reset 后再派发一次 search
  • hiddendisabled 支持函数写法,会基于当前 model 实时重新计算。
  • collapsed 受控时,组件只派发 update:collapsed / collapse-change,真实展开状态由外层 props.collapsed 决定。