Skip to content

ProForm 高级表单

概述

ProForm 是一个配置化驱动的高级表单组件,支持 20+ 字段类型、网格布局、表单验证和动态选项加载,通过 JSON 配置即可生成完整的表单。

基本用法

vue
<script setup lang="ts">
import ProForm from '@/components/Pro/ProForm/index.vue'
import type { ProFormItem } from '@/types/pro'

const formItems: ProFormItem[] = [
  {
    name: 'username',
    label: '用户名',
    type: 'input',
    required: true,
    placeholder: '请输入用户名',
  },
  {
    name: 'email',
    label: '邮箱',
    type: 'input',
    rules: [{ type: 'email', message: '请输入正确的邮箱格式' }],
  },
  {
    name: 'role',
    label: '角色',
    type: 'select',
    options: [
      { label: '管理员', value: 'admin' },
      { label: '用户', value: 'user' },
    ],
  },
  {
    name: 'enabled',
    label: '启用',
    type: 'switch',
    valuePropName: 'checked',
    initialValue: true,
  },
]

const handleSubmit = (values: Record<string, any>) => {
  console.log('表单提交:', values)
}
</script>

<template>
  <ProForm :form-items="formItems" @submit="handleSubmit" />
</template>

Props

属性类型默认值说明
formItemsProFormItem[]必填表单字段配置
initialValuesRecord<string, any>表单初始值
layoutProFormLayout{ labelCol: { span: 6 }, wrapperCol: { span: 18 }, layout: 'horizontal' }表单布局
gridProFormGrid{ gutter: 16, cols: 1 }网格布局配置

ProFormItem

表单字段配置接口:

属性类型说明
namestring字段名(必填)
labelstring字段标签(必填)
typeFormItemType字段类型(必填)
requiredboolean是否必填(自动添加必填验证)
rulesany[]自定义验证规则
initialValueany默认值
dependenciesstring[]依赖的字段(值变化时触发重渲染)
tooltipstring帮助提示文本
placeholderstring占位提示文本
colSpannumber网格列跨度
hiddenboolean | ((values: Record<string, any>) => boolean)是否隐藏,支持函数形式根据其他字段值动态控制
optionsArray<{ label, value, disabled? }> | ((values) => Array<{ label, value, disabled? }>)选项列表,支持函数形式根据其他字段值动态生成
propsRecord<string, any>传递给组件的额外属性
valuePropNamestring值属性名(如 Switch 使用 'checked'
render(form) => any自定义渲染函数
request() => Promise<Array<{ label, value }>>动态加载选项

FormItemType 字段类型

类型说明适用场景
input文本输入框姓名、标题等文本
password密码输入框密码
textarea多行文本描述、备注
number数字输入框数量、金额
select下拉选择状态、类型等枚举
radio单选框少量选项的单选
checkbox复选框多选
switch开关布尔值
datePicker日期选择器日期
timePicker时间选择器时间
dateRange日期范围起止日期
timeRange时间范围起止时间
upload文件上传文件、图片
slider滑动条范围值
rate评分星级评分
colorPicker颜色选择器颜色
cascader级联选择省市区等层级
treeSelect树形选择部门、分类等树形数据
custom自定义配合 render 实现任意组件

布局配置

ProFormLayout

属性类型说明
labelCol{ span: number }标签栅格占位
wrapperCol{ span: number }输入控件栅格占位
layout'horizontal' | 'vertical' | 'inline'表单布局方向

ProFormGrid

属性类型说明
gutternumber列间距(px)
colsnumber列数

网格布局示例

vue
<ProForm
  :form-items="formItems"
  :grid="{ gutter: 24, cols: 2 }"
/>

使用 colSpan 让某些字段占据多列:

typescript
const formItems: ProFormItem[] = [
  { name: 'name', label: '姓名', type: 'input', colSpan: 1 },
  { name: 'email', label: '邮箱', type: 'input', colSpan: 1 },
  { name: 'description', label: '描述', type: 'textarea', colSpan: 2 }, // 跨两列
]

动态选项

使用 request 属性异步加载选项:

typescript
{
  name: 'department',
  label: '部门',
  type: 'treeSelect',
  request: async () => {
    const res = await fetchDepartments()
    return res.map(d => ({ label: d.name, value: d.id }))
  },
}

动态字段联动

hiddenoptions 均支持函数形式,接收当前所有字段值作为参数,实现字段间的联动控制:

动态显示/隐藏

typescript
const formItems: ProFormItem[] = [
  {
    name: 'notifyType',
    label: '通知方式',
    type: 'select',
    options: [
      { label: '邮箱', value: 'email' },
      { label: '短信', value: 'sms' },
    ],
  },
  {
    name: 'email',
    label: '邮箱地址',
    type: 'input',
    hidden: (values) => values.notifyType !== 'email',
  },
  {
    name: 'phone',
    label: '手机号码',
    type: 'input',
    hidden: (values) => values.notifyType !== 'sms',
  },
]

动态选项

typescript
const formItems: ProFormItem[] = [
  {
    name: 'country',
    label: '国家',
    type: 'select',
    options: [
      { label: '中国', value: 'cn' },
      { label: '美国', value: 'us' },
    ],
  },
  {
    name: 'city',
    label: '城市',
    type: 'select',
    options: (values) => {
      if (values.country === 'cn') {
        return [
          { label: '北京', value: 'beijing' },
          { label: '上海', value: 'shanghai' },
        ]
      }
      if (values.country === 'us') {
        return [
          { label: '纽约', value: 'new_york' },
          { label: '旧金山', value: 'san_francisco' },
        ]
      }
      return []
    },
  },
]

Events

事件参数说明
submit(values: Record<string, any>)表单提交(验证通过后)
finish(values: Record<string, any>)同 submit
valuesChange(changedValues, allValues)字段值变化

Slots

插槽名说明
footer自定义表单底部按钮区域

暴露方法

方法返回类型说明
validate()Promise<Record<string, any>>触发表单验证
resetFields()void重置表单
setFieldsValue(values)void设置字段值
getFieldsValue()Record<string, any>获取所有字段值
formRefFormInstance获取 Ant Design Form 实例
vue
<script setup lang="ts">
const formRef = ref()

// 手动设置值
formRef.value?.setFieldsValue({ name: '张三', status: 'active' })

// 获取所有值
const values = formRef.value?.getFieldsValue()

// 手动触发验证
const result = await formRef.value?.validate()

// 重置表单
formRef.value?.resetFields()
</script>

<template>
  <ProForm ref="formRef" :form-items="formItems" />
</template>

基于 MIT 许可发布