浅析Element中form表单配置rules验证流程
在el-form
中配置了rules
表单验证规则,那么在提交时通过调用el-form
组件的 validate
方法,即可完成对所有表单项el-form-item
的填写值的校验。
看了Element
中el-form
、el-form-item
源码,整理了下流程,让自己思路更清晰。
- 通过调用
el-form
的validate
方法发起表单校验
-
el-form
中用一个数组fields
收集每个el-form-item
表单项组件- 事件触发方式收集,机制详见我另一篇文章:Element中的自定义事件的监听和触发
-
遍历
fields
,调用每个el-form-item
组件中定义的validate
方法- 校验的工作就是在
validate
中完成的
- 用到了一个第三方校验库:
async-validator
- 校验的工作就是在
- 在
el-form-item
的validate
方法验证后,调用传入的callback
,将校验结果返回给el-form
的validate
方法
-
最终,整个验证流程结束。总结一下就是:
- 表单字段校验工作由每个表单项自己负责
- 父组件
el-form
只负责从子组件el-form-item
中拿到校验结果并返回给我们。
流程图
画了个流程图方便理解。(放大看,更清晰哦~)
实测代码
<template>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label="活动名称" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
ruleForm: {
name: ''
},
rules: {
name: [
{ required: true, message: '请输入活动名称', trigger: 'blur' },
{ min: 3, message: '长度 >=3', trigger: 'blur' },
{ max: 5, message: '长度<=5', trigger: 'blur' }
],
}
}
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert('submit!');
} else {
console.log('error submit!!');
return false;
}
});
},
</script>
总结:
最终,整个验证流程结束。总结一下就是:
- 表单字段校验工作由每个表单项自己负责
- 父组件
el-form
只负责从子组件el-form-item
中拿到校验结果并返回给我们。