Skip to content

Data Form 数据表单 ​

该组件用于快速生成数据表单,内部封装了表单渲染、表单验证、文件处理等逻辑,只需传入fields和model属性即可。

全局配置 ​

在全局配置组件属性。

DataForm组件属性配置
ts
app.provide(DATA_FORM_KEY, {
  labelWidth: 'auto',
  labelPosition: 'right',
  // others props...
});

业务注入 ​

在全局注入权限校验和处理文件相关业务。

注入权限校验业务
ts
// 假设当前登录用户拥有以下权限标识
const authoritys = ['docAdmin'];
app.provide(CHECK_AUTHORITY_KEY, authority => authoritys.includes(authority));
注入文件上传地址
ts
app.provide(FILE_UPLOAD_URL_KEY, '/api/file/upload');
注入文件上传header
ts
app.provide(FILE_UPLOAD_HEADER_KEY, {
  Authorization: import.meta.env.VITE_AUTHORIZATION,
  'Blade-Auth': import.meta.env.VITE_BLADE_AUTH,
});
注入文件上传data
ts
app.provide(FILE_UPLOAD_DATA_KEY, {
  action: 'upload',
  rename: true,
  belongOrgId: 'ruralLivingEnv',
  folder: `${new Date().getFullYear()}-${new Date().getMonth() + 1}`,
  flag: true,
});
注入处理文件上传response业务
ts
app.provide(HANDLE_FILE_RESPONSE_KEY, response => {
  return response.data.fileUrl;
});
注入处理文件地址业务
ts
app.provide(HANDLE_FILE_URLS_KEY, urls => {
  return (
    urls
      ?.split(',')
      ?.map(
        url =>
          `${import.meta.env.VITE_FILE_URL}/ruralLivingEnv/fileControll/downLoadFile?swfName=${url}`,
      ) ?? []
  );
});

基础用法 ​

注意

如果表单组件中使用了富文本编辑器,在不使用的时候需要及时销毁表单组件,例如在ElDialog组件中使用,推荐设置destroy-on-close属性为true。

操作按钮 ​

表单内部封装了提交、重置、返回、查询、新增、批量删除六个常用按钮,监听相应事件后自动渲染。

自定义按钮 ​

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

权限校验 ​

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

加密表单项2.1.0 ​

组件提供了加密表单项对数据进行加密展示,加密表单项无法编辑,通过传入解密逻辑可以实现表单项解密后可编辑功能。

提示

加密表单项功能内部基于Verify组件实现,使用前需要在全局配置好验证码组件的相关属性。

行内表单 ​

通过inline属性,你可以用该组件来生成搜索栏,因为搜索栏本质上也是一个表单。

网格布局 ​

传入二维数组形式的fields可以生成网格布局的表单,默认平分宽度,可以通过span属性控制每个表单项的宽度,span为24表示占满整行。

注意

如果是行内表单,则网格布局不会生效。

设置默认值 ​

在某些业务场景,例如修改详情功能,表单可能需要设置默认值,并且某些字段仅作为修改接口的参数,并不需要渲染在页面上。你可以通过model属性来实现表单数据的双向绑定,并且不设置fieldType字段实现把相关字段放在表单数据中,但是不进行渲染。

动态表单 ​

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

表单校验 ​

表单内部封装了校验逻辑,只有required属性为true的表单项才会自动生成校验规则。你可以通过给buttons属性中的按钮设置validate属性来开启表单校验,表单内置的提交和查询按钮validate属性默认为true。

自定义校验规则 ​

你可以通过rules属性给每个表单项传入自定义校验规则,rules支持传入数组,并按顺序同时校验多个自定义规则。框架提供了一些常用校验规则可以直接使用。

自定义表单项 ​

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

属性&事件&插槽透传 ​

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

属性 ​

属性名说明类型默认值
model表单数据T—
fields字段配置信息DataFormFields<T>[]
inline行内表单模式booleanfalse
buttons表单操作按钮DataFormButtons<T>[]
show-reset是否显示重置按钮booleanfalse

DataFormField ​

属性名说明
类型
默认值
prop字段名称 string—
fieldType表单项字段类型FormItemFieldType—
fieldIndex表单项展示位置number—
span表单项占据的列数 number24 / 行内表单项数
authority权限标识string / string[]—
show是否展示booleantrue
style表单项样式 string / CSSProperties—
watchEffect表单项副作用,通常用于实现动态表单功能Function—
tooltip2.1.0表单项提示信息string—
placement2.1.0表单项提示信息出现的位置FormItemPlacementtop

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

fieldType值对应渲染组件 ​

字段类型说明对应的渲染组件
input输入框ElInput
textarea文本域ElInput
phone2.1.2输入框(带手机号校验)ElInput
idcard2.1.2输入框(带身份证校验)ElInput
ciphertext2.1.0加密输入框ElInput、LivVerify
cipherPhone2.1.2加密输入框(带手机号校验)ElInput、LivVerify
cipherIdcard2.1.2加密输入框(带身份证校验)ElInput、LivVerify
select选择器LivSelect
date日期选择器ElDatePicker
dateRange2.2.0日期范围选择器ElDatePicker
time时间选择器ElTimePicker
timeRange2.2.0时间范围选择器ElTimePicker
datetime2.2.0日期时间选择器ElDatePicker
datetimeRange2.2.0日期时间范围选择器ElDatePicker
radio单选框LivRadio
checkbox多选框LivCheckbox
number数字输入框ElInputNumber
numberRange数组范围LivNumberRange
rate评分ElRate
switch开关ElSwitch
clolor拾色器ElColorPicker
image audio video file图片/音频/视频/文件上传ElUpload
dict dictId字典选择器DictSelect
grid gridId gridCode网格选择器LivGridCascader
location2.1.0地图选点LivLocationPicker
verify2.1.2验证码LivVerify
richText富文本编辑器LivRichText
slot插槽—

DataFormButton ​

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

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

事件 ​

事件名说明类型
submit点击提交按钮时触发 Function
rest点击重置按钮时触发Function
back点击返回按钮时触发Function
search点击查询按钮时触发 Function
add点击新增按钮时触发Function
batchDelete点击批量删除按钮时触发Function
类型声明
ts
import type { MaybeRef } from 'vue';
import type { ComponentExposed } from 'vue-component-type-helpers';
import type {
  ButtonProps as ElButtonProps,
  FormInstance as ElFormInstance,
  FormProps as ElFormProps,
} from 'element-plus';
import type { Writable } from 'element-plus/es/utils';
import type {
  CascaderFormItemField,
  CheckboxFormItemField,
  CiphertextFormItemField,
  ColorFormItemField,
  DateFormItemField,
  DateRangeFormItemField,
  DatetimeFormItemField,
  DatetimeRangeFormItemField,
  DictFormItemField,
  GridFormItemField,
  InputFormItemField,
  LocationFormItemField,
  NumberFormItemField,
  NumberRangeFormItemField,
  RadioFormItemField,
  RateFormItemField,
  RenderlessFormItemField,
  RichTextFormItemField,
  SelectFormItemField,
  SlotFormItemField,
  SwitchFormItemField,
  TextareaFormItemField,
  TimeFormItemField,
  TimeRangeFormItemField,
  UploadFormItemField,
  VerifyFormItemField,
} from '../../form-item';
import type { TwoDimensionArrayable } from '@liv-web/utils';
import DataForm from './data-form.vue';

/**
 * 表单组件属性
 * @template T 表单的数据类型
 */
export interface DataFormProps<T = Record<string | number | symbol, any>, U = DataFormFields<T>> {
  /**
   * 表单数据
   * @template T 表单的数据类型
   */
  model: T;
  /**-
   * 表单字段配置项
   * @template U 表单配置项类型
   */
  fields?: U;
  /**
   * 行内表单模式
   * @defaultValue false
   */
  inline?: boolean;
  /**
   * 表单操作按钮
   * @remarks 如果表单inline属性为true,则按钮展示在最后一个表单项右侧。如果inline属性为false,则按钮居中展示在最后一个表单项底部
   * @template T 表单的数据类型
   * @defaultValue []
   */
  buttons?: DataFormButtons<T>;
  /**
   * 是否显示重置按钮
   * @remarks 组件内置的重置按钮已经实现了重置表单逻辑,设置`showReset`属性为`true`即可,也可以手动传入组件的@reset方法以覆盖表单的重置逻辑
   * @defaultValue false
   */
  showReset?: boolean;
  /**
   * 表单提交按钮点击事件
   * @remarks 传入该属性后会自动渲染提交按钮,并且会自动触发表单校验,校验通过后才会触发{@link onSubmit}属性传入的回调方法
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onSubmit?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
  /**
   * 表单查询按钮点击事件
   * @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 传入该属性后会自动渲染返回按钮
   * @template T 表单的数据类型
   * @param form 表单数据
   * @param formRef 表单实例
   */
  onBack?: (form: T, formRef: ElFormInstance | null) => void | Promise<any>;
}

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

/**
 * 表单字段配置项
 * @template T 表单的数据类型
 */
export type DataFormField<T = Record<string | number | symbol, any>> =
  | RenderlessFormItemField<T>
  | InputFormItemField<T>
  | TextareaFormItemField<T>
  | CiphertextFormItemField<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>
  | RateFormItemField<T>
  | ColorFormItemField<T>
  | UploadFormItemField<T>
  | DictFormItemField<T>
  | GridFormItemField<T>
  | LocationFormItemField<T>
  | RichTextFormItemField<T>
  | VerifyFormItemField<T>
  | SlotFormItemField<T>;

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

/**
 * 表单操作按钮
 * @template T 表单的数据类型
 */
export interface DataFormButton<T = Record<string | number | symbol, any>>
  extends Partial<Writable<ElButtonProps>> {
  /**
   * 按钮名称
   */
  name: string;
  /**
   * 按钮权限
   */
  authority?: string | string[];
  /**
   * 展示顺序
   * @remarks 组件内置的提交、搜索、重置、新增、批量删除、返回按钮order分别为10、20、30、40、50、60,如果想要让自定义按钮显示在提交和重置按钮之间,order可以设置为10~30之间,如果不设置order则默认展示在内置按钮后面
   */
  order?: number;
  /**
   * 是否显示按钮
   * @defaultValue true
   */
  show?: boolean;
  /**
   * 是否需要校验表单
   * @remarks 如果为true,点击按钮会自动触发表单校验,并且校验通过后才会执行{@link onClick}事件
   * @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;
}

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

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