Skip to content

AcroDynamicForm ( Acro 动态表单 )

基于 Arco Design Vue 封装的动态表单组件

注意

演示

基础用法

组件插槽&表单项插槽

操作按钮区域插槽

渲染自定义组件

预设

完整示例

账号登录

验证码登录

API

Props

参数名描述类型默认值
fields字段配置列表DynamicFormField[]-
model表单数据Record<string, any>-
actionButtonArea操作按钮区域配置ActionButtonAreaOptions | booleantrue
submitButton提交按钮配置SubmitButtonOptions | booleantrue
resetButton重置按钮配置ResetButtonOptions | booleantrue

Methods

ts
validate
; // 校验全部表单数据
validateField
; // 校验部分表单数据
resetFields
; // 重置表单数据
clearValidate
; // 清除校验状态
setFields
; // 设置表单项的值和状态
scrollToField
; // 滚动到指定表单项
reset
; // 重置表单数据, 是 `resetFields` 方法的别名
init
; // 初始化表单数据

Events

事件名描述回调参数
submit点击了提交按钮的事件model: Record<string, any>
reset点击了重置按钮的事件-

Slots

名称描述
actionButtonArea操作按钮区域插槽, 可使用该插槽代替操作按钮区域的渲染
actionButtonPrepend操作按钮前置插槽, 可插入内容到提交按钮前面
actionButtonAppend操作按钮后置插槽, 可插入内容到重置按钮后面

对外导出工具方法

ts
import { 
defineAcroDynamicFormField
,
defineAcroDynamicFormFields
,
defineAcroDynamicFormPreset
} from '@mixte/snippets/acro-dynamic-form';
defineAcroDynamicFormField
; // 定义单个字段配置
defineAcroDynamicFormFields
; // 定义字段配置列表
defineAcroDynamicFormPreset
; // 定义预设

类型定义

字段配置

ts
/** 字段配置 */
type AcroDynamicFormField = AcroDynamicFormComponentField | AcroDynamicFormFieldBase;

/** 字段通用配置 */
interface AcroDynamicFormFieldBase {
  /** 字段名 */
  field: string;
  /** 标签 */
  label?: string;
  /** 默认值 */
  defaultValue?: any;
  /** 校验规则 */
  rules?: FieldRule | FieldRule[];
  /**
   * 触发校验的事件
   * @default ['change', 'blur']
   */
  validateTrigger?: FormItemInstance['validateTrigger'];
  /** 传递给 FormItem 组件的参数 */
  formItemProps?: Omit<FormItemInstance['$props'], 'field' | 'label' | 'rules' | 'validateTrigger'>;
  /** 传递给 FormItem 组件的插槽 */
  formItemSlots?: {
    /** 标签 */
    label?: () => VNodeChild;
    /** 帮助信息 */
    help?: () => VNodeChild;
    /** 额外内容 */
    extra?: () => VNodeChild;
    /** 其他插槽 ( 预留 ) */
    [key: string]: ((...args: any[]) => VNodeChild) | undefined;
  };
  /** 字段类型 */
  type?: string;
  /** 传递给组件的参数 */
  componentProps?: Record<string, any>;
  /** 传递给组件的插槽 */
  componentSlots?: Record<string, (...args: any[]) => VNodeChild>;
  /** 组件渲染函数或插槽名称 */
  render?: ((options: RenderOptions) => VNodeChild) | string;
  /** 预设 */
  preset?: symbol | symbol[];
}

/** 组件字段配置 */
type AcroDynamicFormComponentField = {
  [T in AcroDynamicFormFieldType]: Omit<AcroDynamicFormFieldBase, 'type' | 'componentProps'> & {
    /** 字段类型 */
    type: T;
    /** 传递给组件的参数 */
    componentProps?: Omit<AcroDynamicFormFieldComponentPropsMap[T], 'modelValue'>;
  };
}[AcroDynamicFormFieldType];

/** 字段类型 */
type AcroDynamicFormFieldType = keyof AcroDynamicFormFieldComponentPropsMap;

/** 字段配置组件参数映射 */
interface AcroDynamicFormFieldComponentPropsMap {
  'input': InputInstance['$props'];
  'input-group': InputGroupInstance['$props'];
  'input-number': InputNumberInstance['$props'];
  'input-password': InputPasswordInstance['$props'];
  'input-search': InputSearchInstance['$props'];
  'input-tag': InputTagInstance['$props'];
  'textarea': TextareaInstance['$props'];
  'select': SelectInstance['$props'];
  'cascader': CascaderInstance['$props'];
  'cascader-panel': CascaderPanelInstance['$props'];
  'tree-select': TreeSelectInstance['$props'];
  'date-picker': DatePickerInstance['$props'];
  'time-picker': TimePickerInstance['$props'];
  'year-picker': YearPickerInstance['$props'];
  'month-picker': MonthPickerInstance['$props'];
  'quarter-picker': QuarterPickerInstance['$props'];
  'week-picker': WeekPickerInstance['$props'];
  'range-picker': RangePickerInstance['$props'];
  'checkbox': CheckboxInstance['$props'];
  'checkbox-group': CheckboxGroupInstance['$props'];
  'radio': RadioInstance['$props'];
  'radio-group': RadioGroupInstance['$props'];
  'switch': SwitchInstance['$props'];
  'upload': UploadInstance['$props'];
  'transfer': TransferInstance['$props'];
  'slider': SliderInstance['$props'];
  'rate': RateInstance['$props'];
  'auto-complete': AutoCompleteInstance['$props'];
  'mention': MentionInstance['$props'];
  'verification-code': VerificationCodeInstance['$props'];
  'color-picker': ColorPickerInstance['$props'];
}

操作按钮区域配置

ts
/** 操作按钮区域配置 */
interface ActionButtonAreaOptions {
  /**
   * 是否显示操作按钮区域
   * @default true
   */
  show?: boolean;
  /** 传递给操作按钮区域 FormItem 组件的参数 */
  props?: FormItemInstance['$props'];
  /** 传递给操作按钮区域 Space 组件的参数 */
  spaceProps?: SpaceInstance['$props'];
}

提交按钮配置

ts
/** 提交按钮配置 */
interface SubmitButtonOptions {
  /**
   * 是否显示提交按钮
   * @default true
   */
  show?: boolean;
  /**
   * 提交按钮文字
   * @default '提交'
   */
  text?: string;
  /** 传递给提交按钮组件的参数 */
  props?: ButtonInstance['$props'];
}

重置按钮配置

ts
/** 重置按钮配置 */
interface ResetButtonOptions {
  /**
   * 是否显示重置按钮
   * @default true
   */
  show?: boolean;
  /**
   * 重置按钮文字
   * @default '重置'
   */
  text?: string;
  /** 传递给重置按钮组件的参数 */
  props?: ButtonInstance['$props'];
}

Released under the MIT License.