Skip to content

Data Form 数据表单

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

全局配置

在全局配置组件属性。

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实现表单内容的动态切换,注意需要动态切换的fieldsbuttons必须是响应式数据。

表单校验

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

自定义校验规则

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

自定义表单项

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

属性&事件&插槽透传

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加密输入框ElInputLivVerify
cipherPhone2.1.2加密输入框(带手机号校验)ElInputLivVerify
cipherIdcard2.1.2加密输入框(带身份证校验)ElInputLivVerify
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>>;