Skip to content

Form 表单

表单组件用于数据收集、校验和提交,支持同步/异步校验、联动校验、重置等功能。由 seeFormseeFormItem 组成。

平台差异说明

App(vue)App(nvue)H5小程序

基本使用

表单组件需要配合 seeFormItem 使用,通过 model 绑定表单数据对象。

html
<template>
  <seeForm :model="formData">
    <seeFormItem label="用户名" prop="username">
      <seeInput v-model="formData.username" placeholder="请输入用户名" />
    </seeFormItem>
    <seeFormItem label="密码" prop="password">
      <seeInput v-model="formData.password" type="password" placeholder="请输入密码" />
    </seeFormItem>
  </seeForm>
</template>

<script setup>
import { reactive } from 'vue'

const formData = reactive({
  username: '',
  password: ''
})
</script>

表单校验

通过 rules 属性配置校验规则,支持 requiredpatternminmaxlenenumtype 等内置规则,也支持自定义 validator

html
<template>
  <seeForm ref="formRef" :model="formData" :rules="rules">
    <seeFormItem label="用户名" prop="username">
      <seeInput v-model="formData.username" placeholder="请输入用户名" />
    </seeFormItem>
    <seeFormItem label="邮箱" prop="email">
      <seeInput v-model="formData.email" placeholder="请输入邮箱" />
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" @click="handleSubmit">提交</seeButton>
    </seeFormItem>
  </seeForm>
</template>

<script setup>
import { reactive, ref } from 'vue'

const formRef = ref(null)
const formData = reactive({
  username: '',
  email: ''
})

const rules = {
  username: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
  ],
  email: [
    { required: true, message: '请输入邮箱', trigger: 'blur' },
    { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
  ]
}

const handleSubmit = async () => {
  try {
    await formRef.value?.validate()
    console.log('校验通过', formData)
  } catch (error) {
    console.log('校验失败', error)
  }
}
</script>

异步校验

支持通过 asyncValidator 进行异步校验,例如检查用户名是否已存在。

html
<script setup>
const rules = {
  username: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    {
      asyncValidator: (rule, value, callback) => {
        // 模拟异步校验
        setTimeout(() => {
          if (value === 'admin') {
            callback(new Error('用户名已存在'))
          } else {
            callback()
          }
        }, 1000)
      },
      trigger: 'blur'
    }
  ]
}
</script>

重置和清除校验

通过 resetFields 方法重置表单字段值,通过 clearValidate 方法清除校验信息。

html
<template>
  <seeForm ref="formRef" :model="formData" :rules="rules">
    <seeFormItem label="用户名" prop="username">
      <seeInput v-model="formData.username" />
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" @click="handleSubmit">提交</seeButton>
      <seeButton @click="handleReset">重置</seeButton>
      <seeButton @click="handleClear">清除校验</seeButton>
    </seeFormItem>
  </seeForm>
</template>

<script setup>
const handleReset = () => {
  formRef.value?.resetFields()
}

const handleClear = () => {
  formRef.value?.clearValidate()
}
</script>

Label 位置

通过 labelPosition 属性设置标签位置,支持 leftrighttop 三种模式。

html
<template>
  <seeRadioGroup v-model="labelPosition">
    <seeRadio label="left">左对齐</seeRadio>
    <seeRadio label="right">右对齐</seeRadio>
    <seeRadio label="top">顶部对齐</seeRadio>
  </seeRadioGroup>

  <seeForm :model="formData" :label-position="labelPosition">
    <seeFormItem label="用户名">
      <seeInput v-model="formData.username" />
    </seeFormItem>
    <seeFormItem label="邮箱">
      <seeInput v-model="formData.email" />
    </seeFormItem>
  </seeForm>
</template>

<script setup>
import { ref } from 'vue'

const labelPosition = ref('right')
</script>

登录表单

完整的登录表单示例,包含表单校验和提交。

html
<template>
  <seeForm ref="loginFormRef" :model="loginForm" :rules="loginRules" label-width="0">
    <seeFormItem prop="username">
      <seeInput
        v-model="loginForm.username"
        prefix-icon="user"
        placeholder="请输入用户名"
      />
    </seeFormItem>
    <seeFormItem prop="password">
      <seeInput
        v-model="loginForm.password"
        type="password"
        prefix-icon="lock"
        placeholder="请输入密码"
        show-password
      />
    </seeFormItem>
    <seeFormItem prop="remember">
      <seeCheckbox v-model="loginForm.remember">记住密码</seeCheckbox>
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" style="width: 100%" @click="handleLogin">
        登录
      </seeButton>
    </seeFormItem>
  </seeForm>
</template>

<script setup>
import { reactive, ref } from 'vue'

const loginFormRef = ref(null)
const loginForm = reactive({
  username: '',
  password: '',
  remember: false
})

const loginRules = {
  username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
  password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
}

const handleLogin = async () => {
  try {
    await loginFormRef.value?.validate()
    // 执行登录逻辑
  } catch (error) {
    console.log('登录校验失败', error)
  }
}
</script>

API

Form Props

参数名说明类型默认值可选值平台差异
model表单数据对象(必填)Record<string, unknown>---
rules校验规则Record<string, FormRule | FormRule[]>{}--
labelPosition标签位置string'right''left' / 'right' / 'top'-
labelWidth标签宽度string | number'auto'--
isDisabled是否禁用整组booleanfalse--
isReadonly是否只读整组booleanfalse--
isRequiredAsterisk是否显示必填星号booleantrue--
isShowMessage是否显示校验错误信息booleantrue--
isInline是否行内模式booleanfalse--
size尺寸string'default''small' / 'default' / 'large'-

FormItem Props

参数名说明类型默认值可选值平台差异
prop表单域字段名string---
label标签文本string''--
labelWidth标签宽度string | number---
required是否必填boolean---
rules表单验证规则FormRule | FormRule[]---
error表单域验证错误信息string---
showMessage是否显示校验错误信息booleantrue--
size尺寸string-'small' / 'default' / 'large'-

Form Expose 方法

方法名说明参数返回值
validate对整个表单进行校验callback?: (valid: boolean) => voidPromise<boolean>
validateField对部分字段进行校验props: string | string[], callback?: (valid: boolean) => voidPromise<void>
resetFields重置表单字段值props?: string | string[]void
clearValidate清除表单校验信息props?: string | string[]void
scrollToField滚动到指定表单字段prop: stringvoid
getFieldsValue获取表单所有字段值-Record<string, unknown>
setFieldsValue设置表单字段值values: Record<string, unknown>void

FormRule 类型

参数名说明类型
required是否必填boolean
message错误提示信息string
type字段类型string
trigger触发方式'blur' | 'change'
min最小长度/值number
max最大长度/值number
len长度number
enum枚举值unknown[]
pattern正则表达式RegExp
validator自定义校验函数(rule, value, callback) => void
asyncValidator异步校验函数(rule, value, callback) => void

辽 ICP 备 2025070134 号