element-plus@2.0.6 及之后的版本,表单验证不再是同步执行的了
另外,element-plus@2.1.4 及之后的版本,才可按照官方文档示例正常使用(使用的是两者的中间版本的话,最好先自行确认下正确的
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
console.log('submit!') // 位置1
} else {
console.log('error submit!', fields)
}
})
// 位置2
}
上例中:
如果在“位置1”执行表单验证通过后的业务代码,可以去掉 async...await
如果在“位置2”执行,则需加上。否则,会直接跳过验证
这样,与异步校验(三、6)的使用办法就一致了,两者可以取其一。element-plus@2.1.4及之后的推荐统一使用上例中的写法
表单定义规则
//表单验证规则
const rules = reactive({
name: [{ validator: checkName, trigger: ['blur', 'change'],required: true}],
phone: [{ type: number, validator: checkPhone, trigger: ['blur', 'change'] }],
password: [{ validator: checkpassword, trigger: ['blur'] }],
})
el-form配置
<el-form :model="formData" :rules="rules" ref="baseForm"></el-form>
上一步已经为表单绑定了规则列表formData,接下来,只需要在form-item中使用prop绑定验证规则即可
<el-form-item label="电话" style="width: 40%" prop="phone">
<el-input v-model="formData.phone" type="text" autocomplete="off" disabled />
</el-form-item>
对应关系:
表单对象 formData: { name: '' }
表单元素 prop="name"
规则列表 rules: { name: [{...}] }
另外,验证嵌套属性可以通过 . 连接绑定:
formData: { obj: { name: '' } }
prop="obj.name"
baseRules: { 'obj.name': [{...}] }
完整demo
<template>
<el-form :model="formData" :rules="rules" ref="ruleFormRef" status-icon label-width="120px" size="large">
<el-form-item label="姓名" style="width: 40%" prop="name">
<el-input v-model="form.name" type="text" autocomplete="off" />
</el-form-item>
<el-form-item label="性别" style="width: 40%" prop="sex">
<el-select v-model="form.sex" placeholder="请选择性别">
<el-option label="男" :value=1 />
<el-option label="女" :value=0 />
</el-select>
</el-form-item>
<el-form-item label="生日" style="width: 40%" prop="birthday">
<!-- <el-input v-model="form.birthday" type="text" autocomplete="off" /> -->
<el-date-picker v-model="form.birthday" type="date" placeholder="请选择生日!" style="width: 100%"
value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="电话" style="width: 40%" prop="phone">
<el-input v-model="form.phone" type="text" autocomplete="off" disabled />
</el-form-item>
<el-form-item label="密码" style="width: 40%" prop="password">
<el-input v-model="form.password" type="password" autocomplete="off" show-password />
</el-form-item>
</el-form>
</template>
<script setup>
let formData = reactive({
birthday: '',
name: '',
phone: '',
sex: 1,
password: ''
})
// 验证函数
const checkPhone = (rule, value, callback) => {
console.log(value);
if (!Number.isInteger(Number(value))) {
return callback(new Error('请输入数字!'))
} else if (String(value).length != 11) {
return callback(new Error('您输入的手机位数不是11位!'))
} else {
callback()
}
}
// 验证函数
const checkpassword = (rule, value, callback) => {
console.log(value);
if (String(value).length > 12) {
return callback(new Error('您输入的密码过长!长度不超过12位'))
} else {
callback()
}
}
// 验证函数
const checkName = (rule, value, callback) => {
if (value.length > 8) {
return callback(new Error('您输入的姓名过长!'))
} else {
callback()
}
}
//表单验证规则
const rules = reactive({
name: [{ validator: checkName, trigger: ['blur', 'change'] }],
phone: [{ type: number, validator: checkPhone, trigger: ['blur', 'change'] }],
password: [{ validator: checkpassword, trigger: ['blur'] }],
})
</script>
配置项以及其可选的值(详细文档链接)
Rules API:
- type: 指示要使用的验证器类型
type: string, number, boolean, method, regexp, integer, float, array, object, enum, date, url, hex, email, any
- Required
required:必填/非必填
- Messages
message: 错误提示
- Pattern
pattern: 值需校验通过的正则表达式
- Range
min, max: type为array, string时,指长度。为number时,指大小
- Length
len: type为array, string时,指长度。为number时,指值
- Enumerable
enum: 例:{ type: 'enum', enum: ['admin', 'user', 'guest'] }
Whitespace
Deep Rules 对象的深层规则
fields: 对象的属性名,数组的下标
defaultField: 应用于对象、数组内的所有成员
- Transform
transform: 方法,对值的预处理
- validator
validator: 自定义验证方法
- asyncValidator
asyncValidator: 自定义异步验证方法
trigger: 触发验证的方法,值可用字符串’blur’, ‘change’,也可是数组[‘blur’, ‘change’]
注意,规则数组是按序逐一被执行验证的(trigger='blur’时,更改input框的值不会触发验证)
进阶
1、单项验证
可在表单的项 ( < el-form-item > ) 中单独设置验证规则
<el-form-item label="邮箱:" prop="email"
:rules="[{ type: 'email', message: '邮箱格式错误', trigger: 'change' }]"
></el-form-item>
简写:
<el-form-item label="姓名:" prop="username" required />对于字符串的非空校验,element plus表单验证提供了一种简单的方式(能实现校验,但有很大局限性,而且提示语是英文)
为了代码的可维护性与美观,尽量不要将规则写在模板中。但某些情况下必须如此,比如,当需要额外传递参数给validator时:
<el-form-item label="样本类型:" prop="sampType"
:rules="[{ validator: (rule, value, cb) => validateSampType(rule, value, cb, yourParams), trigger: 'change' }]"
></el-form-item>
正则校验
//regex.js
// 手机号或座机号
export const reg_tel_phone = /(^((\+86)|(86))?(1[3-9])\d{9}$)|(^(0\d{2,3})-?(\d{7,8})$)/
//doctor.vue
import { reg_tel_phone } from '@/assets/regex'
rules: {
name: [{ required: true, message: '请输入医生名称', trigger: 'blur' }],
title: [{ required: true, message: '请选择职称', trigger: 'change' }],
tel: [{ pattern: reg_tel_phone, message: '请输入正确的手机号或座机号', trigger: ['blur', 'change'] }]
},
注意:直接在vue模板中进行单项验证使用正则校验时,需将RegExp定义成响应式变量。
版权归原作者 柑橘乌云_ 所有, 如有侵权,请联系我们删除。