Skip to content

Form

EsForm is a form container component used for data collection, validation, and submission. It supports async validation, custom rules, reset, and clearing methods.

Basic Usage

Email
Password
<script setup lang="ts">
import { reactive, ref } from 'vue'
import EsForm from '@/components/Form/Form.vue'
import EsFormItem from '@/components/Form/FormItem.vue'
import Input from '@/components/Input/Input.vue'
import Button from '@/components/Button/Button.vue'
const model = reactive({
  email: '',
  password: ''
})

const formRef = ref()
const submit = async () => {
  try {
    await formRef.value.validate()
    alert('Passed!')
  } catch (e) {
    alert('Validation failed')
  }
}
</script>

<template>
  <EsForm :model="model" ref="formRef">
    <EsFormItem prop="email" label="Email">
      <Input v-model="model.email" placeholder="Enter email" />
    </EsFormItem>
    <EsFormItem prop="password" label="Password">
      <Input v-model="model.password" placeholder="Enter password" />
    </EsFormItem>
    <EsFormItem>
      <Button @click.prevent="submit" type="primary">Submit</Button>
    </EsFormItem>
  </EsForm>
</template>

Validation

*Email
*Password
*Agreement
<script setup lang="ts">
import { reactive, ref } from 'vue'
import EsForm from '@/components/Form/Form.vue'
import EsFormItem from '@/components/Form/FormItem.vue'
import Input from '@/components/Input/Input.vue'
import Button from '@/components/Button/Button.vue'
import Switch from '@/components/Switch/Switch.vue'
const model = reactive({
  email: '',
  password: '',
  agreement: false
})

const rules = {
  email: [
    { type: 'email', required: true, message: '请输入合法邮箱', trigger: 'blur' }
  ],
  password: [
    { required: true, message: '请输入密码', trigger: 'blur' },
    { min: 6, message: '密码至少6位', trigger: 'blur' }
  ],
  agreement: [
    { type: 'enum', enum: [true], required: true, message: '请同意协议', trigger: 'change' }
  ]
}

const formRef = ref()
const submit = async () => {
  try {
    await formRef.value.validate()
    alert('Passed!')
  } catch (e) {
    alert('Validation failed')
  }
}
</script>

<template>
  <EsForm :model="model" :rules="rules" ref="formRef">
    <EsFormItem prop="email" label="Email">
      <Input v-model="model.email" placeholder="Enter email" />
    </EsFormItem>
    <EsFormItem prop="password" label="Password">
      <Input v-model="model.password" type="password" />
    </EsFormItem>
    <EsFormItem prop="agreement" label="Agreement">
      <Switch v-model="model.agreement" />
    </EsFormItem>
    <EsFormItem>
      <Button @click.prevent="submit" type="primary">Submit</Button>
    </EsFormItem>
  </EsForm>
</template>

Reset and Clear Validation

*Email
*Password
<script setup lang="ts">
import { reactive, ref } from 'vue'
import EsForm from '@/components/Form/Form.vue'
import EsFormItem from '@/components/Form/FormItem.vue'
import Input from '@/components/Input/Input.vue'
import Button from '@/components/Button/Button.vue'
const model = reactive({
  email: '',
  password: ''
})

const rules = {
  email: [{ required: true, message: '请输入邮箱', trigger: 'blur' }],
  password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
}

const formRef = ref()

const submit = () => {
  formRef.value.validate().then(() => alert('Passed!')).catch(() => alert('Failed'))
}

const reset = () => {
  formRef.value.resetFields()
}

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

<template>
  <EsForm :model="model" :rules="rules" ref="formRef">
    <EsFormItem prop="email" label="Email">
      <Input v-model="model.email" placeholder="Enter email" />
    </EsFormItem>
    <EsFormItem prop="password" label="Password">
      <Input v-model="model.password" type="password" />
    </EsFormItem>
    <EsFormItem>
      <Button @click.prevent="submit" type="primary">Submit</Button>
      <Button @click.prevent="reset" type="danger" plain>Reset</Button>
      <Button @click.prevent="clear" type="warning" plain>Clear Validate</Button>
    </EsFormItem>
  </EsForm>
</template>

Triggering Validation

*Name
*Zone
<script setup lang="ts">
import { reactive, ref } from 'vue'
import EsForm from '@/components/Form/Form.vue'
import EsFormItem from '@/components/Form/FormItem.vue'
import Input from '@/components/Input/Input.vue'
import Button from '@/components/Button/Button.vue'
import Select from '@/components/Select/Select.vue'
const model = reactive({
  name: '',
  zone: ''
})
const options = [
  { label: 'zone 1', value: 'one' },
  { label: 'zone 2', value: 'two' },
  { label: 'zone 3', value: 'three' }
]

const rules = {
  name: [
    { required: true, message: '请输入姓名', trigger: 'blur' }
  ],
  zone: [
    { required: true, message: '请选择区域', trigger: 'change' }
  ]
}

const formRef = ref()
const submit = () => {
  formRef.value.validate().then(() => alert('提交成功')).catch(() => alert('校验失败'))
}
</script>

<template>
  <EsForm :model="model" :rules="rules" ref="formRef">
    <EsFormItem prop="name" label="Name">
      <Input v-model="model.name" placeholder="Blur trigger" />
    </EsFormItem>
    <EsFormItem prop="zone"  label="Zone">
      <Select v-model="model.zone" :options="options" />
    </EsFormItem>
    <EsFormItem>
      <Button @click.prevent="submit" type="primary">Submit</button>
    </EsFormItem>
  </EsForm>
</template>

EsForm Attributes

NameDescriptionTypeDefault
modelForm data object (reactive)Record<string, any>
rulesValidation rule objectFormRules

EsForm Methods

Use ref to access the EsForm instance and call the following methods:

MethodDescription
validate()Validate all fields, returns Promise
resetFields()Reset all field values
clearValidate()Clear validation state of all fields

EsFormItem Attributes

NameDescriptionTypeDefault
labelLabel textstring
propField name in the modelstring

Validation Rules (FormRules)

ts
export interface FormRules {
  [prop: string]: Array<FormRule>
}

export interface FormRule {
  required?: boolean
  type?: string // e.g. "string", "email", "enum"
  min?: number
  max?: number
  enum?: any[]
  message?: string
  trigger?: 'blur' | 'change'
  validator?: (value: any) => boolean | string
}