Skip to content

Form

Form component is used for data collection, validation and submission. It supports sync/async validation, linked validation, reset and other features. Composed of seeForm and seeFormItem.

Platform Compatibility

App(vue)App(nvue)H5Mini Program

Basic Usage

Form component needs to be used with seeFormItem. Bind the form data object via model.

html
<template>
  <seeForm :model="formData">
    <seeFormItem label="Username" prop="username">
      <seeInput v-model="formData.username" placeholder="Please enter username" />
    </seeFormItem>
    <seeFormItem label="Password" prop="password">
      <seeInput v-model="formData.password" type="password" placeholder="Please enter password" />
    </seeFormItem>
  </seeForm>
</template>

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

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

Form Validation

Configure validation rules via the rules property. Supports built-in rules like required, pattern, min, max, len, enum, type, as well as custom validator.

html
<template>
  <seeForm ref="formRef" :model="formData" :rules="rules">
    <seeFormItem label="Username" prop="username">
      <seeInput v-model="formData.username" placeholder="Please enter username" />
    </seeFormItem>
    <seeFormItem label="Email" prop="email">
      <seeInput v-model="formData.email" placeholder="Please enter email" />
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" @click="handleSubmit">Submit</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: 'Please enter username', trigger: 'blur' },
    { min: 2, max: 20, message: 'Length should be 2 to 20 characters', trigger: 'blur' }
  ],
  email: [
    { required: true, message: 'Please enter email', trigger: 'blur' },
    { type: 'email', message: 'Please enter a valid email address', trigger: 'blur' }
  ]
}

const handleSubmit = async () => {
  try {
    await formRef.value?.validate()
    console.log('Validation passed', formData)
  } catch (error) {
    console.log('Validation failed', error)
  }
}
</script>

Async Validation

Supports async validation via asyncValidator, for example checking if a username already exists.

html
<script setup>
const rules = {
  username: [
    { required: true, message: 'Please enter username', trigger: 'blur' },
    {
      asyncValidator: (rule, value, callback) => {
        // Simulate async validation
        setTimeout(() => {
          if (value === 'admin') {
            callback(new Error('Username already exists'))
          } else {
            callback()
          }
        }, 1000)
      },
      trigger: 'blur'
    }
  ]
}
</script>

Reset and Clear Validation

Reset form field values via resetFields method, and clear validation messages via clearValidate method.

html
<template>
  <seeForm ref="formRef" :model="formData" :rules="rules">
    <seeFormItem label="Username" prop="username">
      <seeInput v-model="formData.username" />
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" @click="handleSubmit">Submit</seeButton>
      <seeButton @click="handleReset">Reset</seeButton>
      <seeButton @click="handleClear">Clear Validation</seeButton>
    </seeFormItem>
  </seeForm>
</template>

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

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

Label Position

Set label position via labelPosition property, supporting left, right and top modes.

html
<template>
  <seeRadioGroup v-model="labelPosition">
    <seeRadio label="left">Left Aligned</seeRadio>
    <seeRadio label="right">Right Aligned</seeRadio>
    <seeRadio label="top">Top Aligned</seeRadio>
  </seeRadioGroup>

  <seeForm :model="formData" :label-position="labelPosition">
    <seeFormItem label="Username">
      <seeInput v-model="formData.username" />
    </seeFormItem>
    <seeFormItem label="Email">
      <seeInput v-model="formData.email" />
    </seeFormItem>
  </seeForm>
</template>

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

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

Login Form

A complete login form example with validation and submission.

html
<template>
  <seeForm ref="loginFormRef" :model="loginForm" :rules="loginRules" label-width="0">
    <seeFormItem prop="username">
      <seeInput
        v-model="loginForm.username"
        prefix-icon="user"
        placeholder="Please enter username"
      />
    </seeFormItem>
    <seeFormItem prop="password">
      <seeInput
        v-model="loginForm.password"
        type="password"
        prefix-icon="lock"
        placeholder="Please enter password"
        show-password
      />
    </seeFormItem>
    <seeFormItem prop="remember">
      <seeCheckbox v-model="loginForm.remember">Remember password</seeCheckbox>
    </seeFormItem>
    <seeFormItem>
      <seeButton type="primary" style="width: 100%" @click="handleLogin">
        Login
      </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: 'Please enter username', trigger: 'blur' }],
  password: [{ required: true, message: 'Please enter password', trigger: 'blur' }]
}

const handleLogin = async () => {
  try {
    await loginFormRef.value?.validate()
    // Execute login logic
  } catch (error) {
    console.log('Login validation failed', error)
  }
}
</script>

API

Form Props

ParameterDescriptionTypeDefaultPlatform
modelForm data object (required)Record<string, unknown>--
rulesValidation rulesRecord<string, FormRule | FormRule[]>{}-
labelPositionLabel positionstring'right'-
labelWidthLabel widthstring | number'auto'-
isDisabledWhether to disable the entire formbooleanfalse-
isReadonlyWhether the entire form is readonlybooleanfalse-
isRequiredAsteriskWhether to show required asteriskbooleantrue-
isShowMessageWhether to show validation error messagesbooleantrue-
isInlineWhether to use inline modebooleanfalse-
sizeSizestring'default'-

FormItem Props

ParameterDescriptionTypeDefaultPlatform
propForm field namestring--
labelLabel textstring''-
labelWidthLabel widthstring | number--
requiredWhether the field is requiredboolean--
rulesForm validation rulesFormRule | FormRule[]--
errorForm field validation error messagestring--
showMessageWhether to show validation error messagesbooleantrue-
sizeSizestring--

Form Expose Methods

MethodDescriptionParametersReturn Value
validateValidate the entire formcallback?: (valid: boolean) => voidPromise<boolean>
validateFieldValidate specific fieldsprops: string | string[], callback?: (valid: boolean) => voidPromise<void>
Reset form field valuesReset form field valuesprops?: string | string[]void
clearValidateClear form validation messagesprops?: string | string[]void
scrollToFieldScroll to the specified form fieldprop: stringvoid
getFieldsValueGet all form field values-Record<string, unknown>
setFieldsValueSet form field valuesvalues: Record<string, unknown>void

FormRule Type

ParameterDescriptionType
requiredWhether the field is requiredboolean
messageError messagestring
typeField typestring
triggerTrigger method'blur' | 'change'
minMinimum length/valuenumber
maxMaximum length/valuenumber
lenLengthnumber
enumEnum valuesunknown[]
patternRegular expressionRegExp
validatorCustom validation function(rule, value, callback) => void
asyncValidatorAsync validation function(rule, value, callback) => void

Liao ICP No. 2025070134