Form 表单组件
表单组件,包含表单验证、字段管理等功能。
基础用法
基础的表单用法,包含表单验证功能。
Activity name
Activity zone
Instant delivery
Activity form
<template>
<my-form
:model="form"
:rules="rules"
label-width="auto"
style="max-width: 600px"
>
<my-form-item label="Activity name">
<my-input v-model="form.name" />
</my-form-item>
<my-form-item label="Activity zone">
<my-select
v-model="form.region"
placeholder="please select your zone"
>
<my-option
label="Zone one"
value="shanghai"
/>
<my-option
label="Zone two"
value="beijing"
/>
</my-select>
</my-form-item>
<my-form-item label="Instant delivery">
<my-switch v-model="form.delivery" />
</my-form-item>
<my-form-item label="Activity form">
<my-input
v-model="form.desc"
type="textarea"
/>
</my-form-item>
<my-form-item>
<my-button
type="primary"
@click="onSubmit"
>Create</my-button
>
<my-button>Cancel</my-button>
</my-form-item>
</my-form>
</template>
<script setup>
import { reactive } from 'vue'
const form = reactive({
name: '',
region: '',
delivery: false,
desc: '',
})
const rules = {}
const onSubmit = () => {
console.log('submit!', form)
}
</script>
表单验证
Form 组件允许你验证用户的输入是否符合规范,来帮助你找到和纠正错误。
Form 组件提供了表单验证的功能,只需为 rules 属性传入约定的验证规则,并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 校验规则参见 async-validator
Activity name
Activity zone
Instant delivery
Activity form
<template>
<my-form
ref="formRef"
:model="form"
:rules="rules"
>
<my-form-item
label="Activity name"
prop="name"
required
>
<my-input v-model="form.name" />
</my-form-item>
<my-form-item
label="Activity zone"
prop="region"
required
>
<my-select
v-model="form.region"
placeholder="please select your zone"
>
<my-option
label="Zone one"
value="shanghai"
/>
<my-option
label="Zone two"
value="beijing"
/>
</my-select>
</my-form-item>
<my-form-item
label="Instant delivery"
prop="delivery"
>
<my-switch v-model="form.delivery" />
</my-form-item>
<my-form-item
label="Activity form"
prop="desc"
required
>
<my-input
v-model="form.desc"
type="textarea"
/>
</my-form-item>
<my-form-item>
<my-button
type="primary"
@click="onSubmit"
required
>Create
</my-button>
<my-button @click="reset">Cancel</my-button>
</my-form-item>
</my-form>
</template>
<script setup>
import { reactive, ref } from 'vue'
const formRef = ref()
const form = reactive({
name: '',
region: '',
delivery: false,
desc: '',
})
const rules = {
name: [
{ required: true, message: '请输入活动名称', trigger: 'blur' },
{ min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' },
],
region: [{ required: true, message: '请选择活动区域', trigger: 'change' }],
desc: [{ required: true, message: '请填写活动形式', trigger: 'blur' }],
}
const onSubmit = async () => {
formRef.value.validate()
}
const reset = () => {
formRef.value.resetFields()
}
</script>
自定义校验规则
这个例子中展示了如何使用自定义验证规则来完成密码的二次验证。
Password
Confirm
Age
<template>
<my-form
ref="formRef"
style="max-width: 600px"
:model="ruleForm"
status-icon
:rules="rules"
label-width="auto"
class="demo-ruleForm"
>
<my-form-item
label="Password"
prop="pass"
>
<my-input
v-model="ruleForm.pass"
autocomplete="off"
/>
</my-form-item>
<my-form-item
label="Confirm"
prop="checkPass"
>
<my-input
v-model="ruleForm.checkPass"
autocomplete="off"
/>
</my-form-item>
<my-form-item
label="Age"
prop="age"
>
<my-input v-model.number="ruleForm.age" />
</my-form-item>
<my-form-item>
<my-button
type="primary"
@click="submitForm"
>
Submit
</my-button>
<my-button @click="resetForm">Reset</my-button>
</my-form-item>
</my-form>
</template>
<script setup>
import { reactive, ref } from 'vue'
const formRef = ref()
const ruleForm = reactive({
pass: '',
checkPass: '',
age: '',
})
const rules = reactive({
pass: [
{
validator: (rule, value, callback) => {
if (value.length < 6) {
callback(new Error('请输入6位以上密码'))
} else {
callback()
}
},
trigger: 'blur',
},
],
checkPass: [
{
validator: (rule, value, callback) => {
if (value !== ruleForm.pass) {
callback(new Error('两次输入密码不一致'))
} else {
callback()
}
},
trigger: 'blur',
},
],
age: [
{
validator: (rule, value, callback) => {
if (value < 18) {
callback(new Error('年龄必须大于18岁'))
} else {
callback()
}
},
trigger: 'blur',
},
],
})
const submitForm = () => {
formRef.value.validate().then(() => {
console.log('校验通过')
})
}
const resetForm = () => {
formRef.value.resetFields()
}
</script>
Form API
Form Attributes
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
model | 表单数据对象 | Record<string, any> | - |
rules | 表单验证规则,更多内容可以参考 async-validator | Record<string, RuleFormItem[]> | - |
disabled | 是否禁用表单所有组件 | boolean | false |
Form Slots
插槽名 | 说明 | 类型 |
---|---|---|
default | 表单内容区域 | - |
Form Exposes
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
validate | 对整个表单进行校验 | - | Promise<any> |
resetFields | 重置所有字段并移除校验结果 | - | void |
clearValidate | 移除表单项的校验结果 | - | void |
FormItem API
FormItem Attributes
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 标签文本 | string | - |
prop | 表单域 model 字段 | string | - |
required | 是否必填 | boolean | false |
disabled | 是否禁用该表单项 | boolean | false |
FormItem Slots
插槽名 | 说明 | 类型 |
---|---|---|
default | 表单的内容 | - |
label | 标签位置显示的内容 | { label: string } |
FormItem Exposes
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
validate | 触发表单项校验 | trigger?: string | Promise<any> |
resetField | 重置当前字段 | - | void |
clearValidate | 移除校验结果 | - | void |