仿ElementUI实现一个Form表单的实现代码

2020-06-14 06:24:33易采站长站整理
,所以当
FormItem
挂载完成后,需要派发一个事件告诉
Form
:你可以校验我了。

解释三:当

FormItem
中有
prop
属性的时候才校验,没有的时候不校验。比如提交按钮就不需要校验。


<e-form-item>
<input type="submit" @click="submitForm()" value="提交">
</e-form-item>

**解释四:**返回一个 promise 对象,批量处理所有异步校验的结果。

解释五:

descriptor
对象是
async-validator
的用法,采用键值对的形式,用来检查当前项。比如:


// 检查当前项
// async-validator 给出的例子
name: {
type: "string",
required: true,
validator: (rule, value) => value === 'muji',
}

FormItem
中检查当前项完成了,现在我们需要处理一下
Form
组件中的全局校验。表单提交时,需要对
form
进行一个全局校验。大致的思路是:循环遍历表单中的所有派发上来的
FormItem
,让每一个
FormItem
执行自己的校验函数,如果有一个为
false
,则校验不通过;否则,校验通过。我们通过代码实现一下:


<template>
<form>
<slot></slot>
</form>
</template>

<script>
export default {
props: {
model: { type: Object, required: true },
rules: { type: Object }
},
provide() {
return {
eForm: this, // provide this component's instance
}
},
data() {
return {
fileds: [],
}
},
created() {
// 解释一
this.fileds = [];
this.$on('addFiled', filed => this.fileds.push(filed));
},
methods: {
async validate(cb) { // 解释二
// 解释三
const eachFiledResultArray = this.fileds.map(filed => filed.validate());

// 解释四
const results = await Promise.all(eachFiledResultArray);
let ret = true;
results.forEach(valid => {
if (!valid) {
ret = false;
}
});
cb(ret);
}
},
}
</script>

<style lang="scss" scoped>