Skip to content

Search Form 搜索表单

该组件用于快速生成搜索表单,内部封装了表单渲染、折叠展开、查询重置等逻辑,只需传入fieldsmodel属性即可。

全局配置

在全局配置组件属性。

SearchForm组件属性配置
ts
app.provide(SEARCH_FORM_KEY, {
  labelWidth: 'auto',
  labelPosition: 'right',
  column: 1,
  importOptions: {
    tip: '导入文件最大不能超过500KB',
    maxSize: 500 * 1024,
    extensions: ['xls', 'xlsx'],
  },
  // others props...
});

业务注入

在全局注入权限校验相关业务。

注入权限校验业务
ts
// 假设当前登录用户拥有以下权限标识
const authoritys = ['docAdmin'];
app.provide(CHECK_AUTHORITY_KEY, authority => authoritys.includes(authority));

基础用法

操作按钮

表单内部封装了查询、重置、新增、批量删除、导入、导出、下载导入模板七个常用按钮,监听相应事件后自动渲染。

自定义按钮

除了使用组件内部封装好的按钮,你还可以通过buttons属性传入自定义按钮,更多按钮属性请查看SearchFormButton

导入导出2.1.0

表单内部封装了统一的导入、导出、下载导入模板功能。可以通过import-options属性设置组件的导入配置,也可以在全局进行统一配置

权限校验

表单内部封装了权限校验逻辑,使用前需要在全局注入权限校验相关方法。内置按钮可以通过()设置权限标识,多个权限标识用|分隔。字段配置项和自定义按钮可以通过authority属性设置权限标识。如果权限标识校验没有通过,则对应的内容不会被渲染。

动态表单

可以通过字段配置项或自定义按钮的watchEffect实现表单内容的动态切换,注意需要动态切换的fieldsbuttons必须是响应式数据。

自定义表单项

通过设置fieldTypeslot,你可以自定义表单项的内容。

属性&事件&插槽透传

Search Form基于ElForm封装,所以你可以传入ElForm的所有属性和事件,并且在字段配置属性fields中,根据fieldType的不同,你可以透传属性和事件给对应的渲染组件,具体fieldType对应的渲染组件请查看fieldType可选值

属性

属性名说明类型默认值
model表单数据T
fields字段配置信息SearchFormFields<T>[]
column表单列数number3
buttons表单操作按钮SearchFormButtons<T>[]
show-reset是否显示重置按钮booleantrue
import-options2.1.0导入配置ImportOptions

SearchFormField

属性名说明
类型
默认值
prop字段名称 string
fieldType表单项字段类型FormItemFieldType
authority权限标识string / string[]
show是否展示booleantrue
style表单项样式,该样式将绑定在表单项具体的实现组件上string / CSSProperties
watchEffect表单项副作用,通常用于实现动态表单功能Function

除了上述属性,你还可以透传对应渲染组件的所有属性和事件。

fieldType值对应渲染组件

字段类型说明对应的渲染组件
input输入框ElInput
phone2.1.2输入框(带手机号校验)ElInput
idcard2.1.2输入框(带身份证校验)ElInput
select选择器LivSelect
date日期选择器ElDatePicker
time时间选择器ElTimePicker
radio单选框LivRadio
checkbox多选框LivCheckbox
number数字输入框ElInputNumber
numberRange数组范围LivNumberRange
switch开关ElSwitch
dict dictId字典选择器DictSelect
grid gridId gridCode网格选择器LivGridCascader
slot

SearchFormButton

属性名说明类型默认值
name按钮名称string
authority按钮权限string / string[]
order按钮顺序 number
show是否显示按钮booleantrue
validate是否需要校验表单 booleanfalse
onClick按钮点击事件Function
watchEffect按钮副作用 Function

除了上述属性,你还可以透传ElButton的所有属性和事件。

事件

事件名说明类型
search点击查询按钮时 Function
reset点击重置按钮时触发 Function
add点击新增按钮时触发Function
batchDelete点击批量删除按钮时触发Function
import2.1.0选中导入文件后触发Function
template2.1.0点击下载模板按钮时触发Function
export点击导出按钮时触发Function
类型声明
ts
import type {
  ButtonProps as ElButtonProps,
  FormInstance as ElFormInstance,
  FormProps as ElFormProps,
} from 'element-plus';
import type {
  CascaderFormItemField,
  CheckboxFormItemField,
  DateFormItemField,
  DateRangeFormItemField,
  DatetimeFormItemField,
  DatetimeRangeFormItemField,
  DictFormItemField,
  GridFormItemField,
  InputFormItemField,
  NumberFormItemField,
  NumberRangeFormItemField,
  RadioFormItemField,
  RenderlessFormItemField,
  SelectFormItemField,
  SlotFormItemField,
  SwitchFormItemField,
  TimeFormItemField,
  TimeRangeFormItemField,
} from '../../form-item';
import type { ComponentExposed } from 'vue-component-type-helpers';
import SearchForm from './search-form.vue';
import { Writable } from 'element-plus/es/utils';
import type { DataFormFields } from '../../data-form';

/**
 * 搜索表单组件属性
 * @template T 表单的数据类型
 */
export interface SearchFormProps<
  T = Record<string | number | symbol, any>,
  U = SearchFormFields<T>,
> {
  /**
   * 表单数据
   * @template T 表单的数据类型
   */
  model: T;
  /**
   * 表单字段配置项
   * @template U 表单配置项类型
   */
  fields?: U;
  /**
   * 表单列数
   * @defaultValue 3
   */
  column?: number;
  /**
   * 表单操作按钮
   * @remarks 如果表单inline属性为true,则按钮展示在最后一个表单项右侧。如果inline属性为false,则按钮居中展示在最后一个表单项底部
   * @template T 表单的数据类型
   * @defaultValue []
   */
  buttons?: SearchFormButton<T>[];
  /**
   * 是否显示重置按钮
   * @defaultValue true
   */
  showReset?: boolean;
  /**
   * 导入配置
   */
  importOptions?: ImportOptions;
  /**
   * 表单搜索按钮点击事件
   * @remarks 传入该属性后会自动渲染搜索按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onSearch?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 表单重置按钮点击事件
   * @remarks 传入该属性后会自动渲染重置按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onReset?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 表单新增按钮点击事件
   * @remarks 传入该属性后会自动渲染新增按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onAdd?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 表单批量删除按钮点击事件
   * @remarks 传入该属性后会自动渲染批量删除按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onBatchDelete?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 表单导入逻辑
   * @remarks 传入该属性后会自动渲染导入按钮
   * @param file 文件对象
   */
  onImport?: (file: File) => void | Promise<any>;
  /**
   * 表单导出按钮点击事件
   * @remarks 传入该属性后会自动渲染导出按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onExport?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 导入弹窗下载导入模板按钮点击事件
   * @remarks 传入该属性后会自动渲染下载导入模板按钮
   */
  onTemplate?: () => void | string | Promise<any> | DataFormFields<T>;
}

/**
 * 搜索表单组件实例
 * @template T 表单的数据类型
 * @template U 表单配置项类型
 */
export type SearchFormInstance<
  T extends Record<string | number | symbol, any> = Record<string | number | symbol, any>,
  U extends SearchFormFields<T> = SearchFormFields<T>,
> = ComponentExposed<typeof SearchForm<T, U>>;

/**
 * 表单字段配置项
 * @template T 表单的数据类型
 */
export type SearchFormField<T = Record<string | number | symbol, any>> =
  | RenderlessFormItemField<T>
  | InputFormItemField<T>
  | SelectFormItemField<T>
  | CascaderFormItemField<T>
  | RadioFormItemField<T>
  | CheckboxFormItemField<T>
  | DateFormItemField<T>
  | DateRangeFormItemField<T>
  | TimeFormItemField<T>
  | TimeRangeFormItemField<T>
  | DatetimeFormItemField<T>
  | DatetimeRangeFormItemField<T>
  | SwitchFormItemField<T>
  | NumberFormItemField<T>
  | NumberRangeFormItemField<T>
  | DictFormItemField<T>
  | GridFormItemField<T>
  | SlotFormItemField<T>;

/**
 * 表单组件字段配置项集合
 * @template T 表单的数据类型
 */
export type SearchFormFields<T = Record<string | number | symbol, any>> = SearchFormField<T>[];

/**
 * 表单操作按钮
 * @template T 表单的数据类型
 */
export interface SearchFormButton<T = Record<string | number | symbol, any>>
  extends Partial<Writable<ElButtonProps>> {
  /**
   * 按钮名称
   */
  name: string;
  /**
   * 按钮权限
   */
  authority?: string | string[];
  /**
   * 展示顺序
   * @remarks 组件内置的新增、批量删除、导入、导出按钮`order`属性分别为10、20、30、40,如果想要让自定义按钮显示在新增和批量删除按钮之间,`order`属性可以设置为10~20之间,如果不设置`order`属性则默认展示在内置按钮后面
   */
  order?: number;
  /**
   * 展示位置
   * @remarks 组件内置的新增、批量删除、导入按钮`position`属性默认为`left`,导出按钮`position`属性默认为`right`
   * @defaultValue 'left'
   */
  position?: 'left' | 'right';
  /**
   * 是否显示按钮
   * @defaultValue true
   */
  show?: boolean;
  /**
   * 加载状态
   * @defaultValue false
   */
  loading?: boolean;
  /**
   * 是否需要校验表单
   * @remarks 如果为true,点击按钮会自动触发表单校验,并且校验通过后才会执行{@link onClick}事件,组件内置的查询按钮`validate`属性默认为`true`
   * @defaultValue false
   */
  validate?: boolean;
  /**
   * 唯一标识
   * @remark 主要用于组件内部区分不同按钮
   */
  key?: string | symbol;
  /**
   * 按钮点击事件
   * @template T 表格的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onClick?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 按钮副作用
   * @remarks 可以在回调函数中拿到表单数据及实例,并动态修改按钮配置
   * @template T 表单的数据类型
   */
  watchEffect?: (form: T, formRef: ElFormInstance | null) => void;
}

/**
 * 表单内置导入按钮
 */
export interface SearchFormImportButton<T> extends Omit<SearchFormButton<T>, 'onClick'> {
  /**
   * 按钮点击事件
   */
  onClick?: () => void;
  /**
   *
   * @param file 选中的文件对象
   * @returns
   */
  handleImport?: (file: File) => void | Promise<any>;
}

/**
 * 表单内置下载模板按钮
 */
export interface SearchFormTemplateButton<T> extends Omit<SearchFormButton<T>, 'onClick'> {
  /**
   * 按钮点击事件
   */
  onClick?: () => void | string | Promise<any> | DataFormFields<T>;
}

/**
 * 表单内置按钮类型
 */
export type SearchFormInnerButton<T> =
  | SearchFormButton<T>
  | SearchFormImportButton<T>
  | SearchFormTemplateButton<T>;

/**
 * 导入配置
 */
export interface ImportOptions {
  /**
   * 提示说明文字
   */
  tip?: string;
  /**
   * 文件大小限制,单位为字节
   */
  maxSize?: number;
  /**
   * 允许上传的文件类型,例如`['xls', '.xlsx']`
   * @defaultValue ['xls', '.xlsx']
   */
  extensions?: string[];
  /**
   * 模板文件名
   * @remark 仅通过fields配置项在前端生成模板文件时生效
   */
  fileName?: string;
  /**
   * 表名称
   * @remark 仅通过fields配置项在前端生成模板文件时生效
   */
  sheetName?: string;
  /**
   * 忽略的字段
   * @remark 仅通过fields配置项在前端生成模板文件时生效
   */
  ignore?: string[];
}

/**
 * 表单操作按钮集合
 * @template T 表单的数据类型
 */
export type SearchFormButtons<T = Record<string | number | symbol, any>> = SearchFormButton<T>[];

/**
 * 搜索表单组件包含透传属性在内的全部属性
 * @template T 表单的数据类型
 */
export type SearchFormFullProps<T> = Partial<ElFormProps & SearchFormProps<T>>;