很多新手对Vue ElementUI如何处理超大型表单不是很清楚。为了帮助大家解决这个问题,下面小编就给大家详细讲解一下。需要的人可以从中学习,希望你能有所收获。
最近因为业务的调整,之前超长表单的逻辑发生了很大的变化,所以打算重构一下(是一个退役的后台写的,没有注释,一个组件写了4000行,真的很无奈)。为了您的方便,我将项目分成了14个部分,并在这里进行了简化。
整体思路
大表单按照业务模块拆分。
保存时使用el-form提供的验证方法进行验证(循环对每一个拆分的组件进行校验)
Mixin对每个组件的公开提取(也有利于后期项目的维护)
开始
这里以拆分两个组件为例:表单1和表单2(为了方便读者,命名为不喷)
这里,为什么ref和model这两个组件会绑定在一起将在后面解释(为了方便以后的维护)。
//form1组件
模板
el型
ref='form '
:model='form '
标签宽度='10px '
El-form-item label=' name ' prop=' name '
El-input TV-model=' form . name '/
/El-表单-项目
/El-表单
/模板
脚本
exportdefault{
名称: '表格1 ',
props: {
form:{}
},
数据(){ 0
返回{
规则:{
名称:[
{必填项:为真,消息:“请输入您的姓名”,触发器:“模糊”}
]
}
}
},
methods:{
//这是为了让父组件循环调用check。
valid form(){ 0
letresult=false
不间断空格
; this.$refs.form.validate(valid => valid && (result = true))
return result
}
// 我这里还用了另一种方式写的,但是循环校验的时候是promise对象,有问题,望大佬们指点一二
validForm() {
// 明明这里输出的结构是 Boolean 值,但在父组件循环调用之后就是promise类型,需要转换一下才行
return this.$refs.form.validate().catch(e => console.log(e))
}
}
}
</script>
// form2 组件
<template>
<el-form
ref="form"
:model="form"
label-width="10px"
>
<el-form-item label="年龄" prop="age">
<el-input v-model="form.age" />
</el-form-item>
</el-form>
</template>
<script>
export default {
name: 'Form2',
props: {
form: {}
},
data() {
return {
rules: {
name: [
{ required: true, message: '请输入年龄', trigger: 'blur' }
]
}
}
},
methods: {
// 这里是是为了父组件循环调用校验
validForm() {
let result = false
this.$refs.form.validate(valid => valid && (result = true))
return result
}
}
}
</script>
-
看一下父组件怎么引用的
// 父组件 <template> <div class="parent"> <form1 ref="form1" :form="formData.form1" /> <form2 ref="form2" :form="formData.form2" /> <el-button type="primary" @click="save">报错</el-button> </div> </template> <script> ... 省略引用 export default { name: 'parent', ... 省略注册 data () { return { formData: { form1: {}, form2: {} } } }, } </script>
-
由于
formData
里的属性名form1
和form2
分别用在子表单组件的ref
上,因此可以在遍历时依次找到他们,修改保存函数,代码如下:
methods: { save () { // 每个表单对象的 key 值,也就是每个表单的 ref 值 const formKeys = Object.keys(this.formData) // 执行每个表单的校验方法 const valids = formKeys.map(item => this.$refs[item].validForm()) // 所有表单通过检验之后的逻辑 if (valids.every(item => item)) { console.log(11) } } }
解答为什么两个组件ref、model
绑定的都是form
-
通过对比我们可以发现
form1 form2
有共同的props methods
-
我们通过 mixin 提取一下
export default { props: { form: { required: true, type: Object, default: () => {} }, }, methods: { validForm () { let result = false this.$refs.form.validate(valid => valid && (result = true)) return result } } }
-
在
form1 form2
中引用该minix
,并在对应组件中删除相应的属性和方法即可 -
超大表单解决起来很麻烦,这里只是对组件的拆分
-
组件之间的联动也是一大难点,等下次整理完再发出来
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/112481.html