Skip to content

Form 表单

介绍

用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型。

基础用法

通过 model 绑定表单数据对象,通过 prop 绑定表单项字段名。

html
<vd-form :model="form">
  <vd-form-item label="账号" prop="user">
    <vd-input v-model="form.user" placeholder="请输入账号" clearable />
  </vd-form-item>
  <vd-form-item label="密码" prop="password">
    <vd-input v-model="form.password" type="password" placeholder="请输入密码" clearable />
  </vd-form-item>
</vd-form>
ts
const form = ref<any>({});

标签位置

通过 label-position 属性配置标签位置,支持 lefttop 两种方式。

html
<vd-form :model="form" label-position="top">
  ...
</vd-form>

标签宽度

通过 label-width 属性配置标签宽度,默认 6.2em 宽度。

html
<vd-form :model="form" label-width="8em">
 ...
</vd-form>

内容对齐方式

通过 body-align 属性配置内容对齐方式,支持 leftcenterright 三种方式。

html
<vd-form :model="form" body-align="right">
 ...
</vd-form>

表单校验

通过 rules 属性配置校验规则,支持 requiredpatternvalidator 等规则。

html
<vd-form ref="formRef" :model="form">
  <vd-form-item label="必填" prop="required" required>
    <vd-input v-model="form.required" placeholder="正则校验" clearable />
  </vd-form-item>
  <vd-form-item label="正则" prop="pattern" required :rules="rule.pattern">
    <vd-input v-model="form.pattern" placeholder="正则校验" clearable />
  </vd-form-item>
  <vd-form-item label="函数" prop="validator" required :rules="rule.validator">
    <vd-input v-model="form.validator" placeholder="函数校验" clearable />
  </vd-form-item>
  <vd-form-item label="异步" prop="async" required :rules="rule.async">
    <vd-input v-model="form.async" placeholder="异步函数" clearable />
  </vd-form-item>
</vd-form>
<vd-button type="primary" block :action="handleSubmit">提交</vd-button>
ts
import { timeout } from '@vital-design/shared';

const formRef = shallowRef();
const form = ref<any>({});

const rule = reactive({
  pattern: [
    { pattern: /^[0-9]+$/g, message: '只能是0-9的数字组合' },
  ],
  validator: [
    {
      validator: (value: any) => val.length >= 2,
      message: '至少输入2位字符',
    }
  ],
  async: [
    {
      validator: async (value: any) => {
        await timeout(1000);

        if (value === '123456') {
          return true;
        }

        return '校验失败,请输入123456';
      },
    }
  ],
});

async function handleSubmit() {
  if (!await formRef.value.validate()) {
    return; // 校验失败
  }

  console.log('校验通过');
}

动态表单

同一对象下的表单项,可通过绑定字段路径 prop 来访问对象下的数据。

html
<vd-form ref="formRef" :model="form">
  <vd-row v-for="(item, index) in form.rows" :key="index" gutter="8" align="center">
    <vd-col span="1">{{ index + 1}}</vd-col>
    <vd-col span="9">
      <vd-form-item :prop="`rows.${index}.name`" required>
        <vd-input v-model="form.rows[index].name" placeholder="请输入姓名" clearable />
      </vd-form-item>
    </vd-col>
    <vd-col span="9">
      <vd-form-item :prop="`rows.${index}.address`" required>
        <vd-input v-model="form.rows[index].address" placeholder="请输入地址" clearable />
      </vd-form-item>
    </vd-col>
    <vd-col span="5">
      <vd-button type="primary" link plain block @click="handleAdd">新增</vd-button>
    </vd-col>
  </vd-row>
</vd-form>
<vd-button type="primary" block @click="handleSubmit">提交</vd-button>
ts
const formRef = shallowRef();

const form = ref<any>({
  rows: [{}],
});

function handleAdd() {
  form.value.rows.push({});
}

async function handleSubmit() {
  if (!await formRef.value.validate()) {
    return; // 校验失败
  }

  console.log('校验通过');
}

API

Form Props

参数说明类型默认值
model表单数据对象any-
rules表单校验规则Record<string, FormItemRule[]>-
borderless是否不显示内边框booleanfalse
label-width标签宽度string6.2em
label-align标签对齐方式'left' | 'center' | 'right''left'
label-position标签位置'left' | 'top''left'
body-align内容对齐方式'left' | 'center' | 'right''left'
required是否展示表单必填星号boolean | 'auto''auto'
required-position表单必填星号展示位置'left' | 'right''left'
validate-first是否在某一项校验不通过时停止校验booleanfalse
scroller滚动至表单项时触发的滚动条节点标识名称string最近的可y轴滚动的滚动条
scroll-direction滚动至表单项时的滚动方向'x' | 'y'['x', 'y']
scroll-offset-left滚动至表单项时的水平滚动偏移量string | number16
scroll-offset-top滚动至表单项时的垂直滚动偏移量string | number16
scroll-to-error是否在提交表单且校验不通过时滚动至错误的表单项booleantrue
error-message是否在校验不通过时在输入框下方展示错误提示booleantrue
error-message-align错误提示文案对齐方式'left' | 'center' | 'right''left'

FormItem Props

参数说明类型默认值
prop表单对象属性string-
value表单项数据,优先级高于 propunknown-
rules表单校验规则FormItemRule[]-
is-link是否展示右侧箭头并开启点击反馈boolean-
clickable是否开启点击反馈boolean-
left-icon左侧图标IconsName-
right-icon右侧图标IconsName-
label标签文字string-
label-width标签宽度string6.2em
label-align标签对齐方式'left' | 'center' | 'right''left'
label-position标签位置'left' | 'top''left'
body-align内容对齐方式'left' | 'center' | 'right''left'
required是否展示表单必填星号boolean | 'auto''auto'
required-position表单必填星号展示位置'left' | 'right''left'
error-message是否在校验不通过时在输入框下方展示错误提示booleantrue
error-message-align错误提示文案对齐方式'left' | 'center' | 'right''left'

代替原始 Props

参数说明类型默认值
custom-id根节点idstring-
custom-class根节点类名ClassValue-
custom-style根节点样式StyleValue-

Form Events

事件名说明回调参数
click点击时触发MouseEvent

FormItem Events

事件名说明回调参数
click点击时触发MouseEvent
click-left-icon点击左侧图标时触发MouseEvent
click-right-icon点击左侧图标时触发MouseEvent
click-label点击标签时触发MouseEvent
click-value点击值区域时触发MouseEvent
click-body点击内容区域时触发MouseEvent
click-error-message点击错误信息时触发MouseEvent

Form Slots

名称说明
default自定义内容

FormItem Slots

名称说明
default自定义内容
left-icon左侧图标
right-icon右侧图标
label标签
error-message错误信息

赣ICP备2025061025号-1