vue+elementUI 复杂表单的验证、数据提交方案问题


Posted in Javascript onJune 24, 2019

当我们在做后台管理系统时,经常会遇到非常复杂的表单:

  • 表单项非常多
  • 在各种表单类型下,显示不同的表单项
  • 在某些条件下,某些表单项会关闭验证
  • 每个表单项还会有其他自定义逻辑,比如 输入框可以插入模板变量、输入字符数量显示、图片上传并显示、富文本 。。。
  • 在这种错综复杂的情况下,完成表单的验证和提交
  • 可以查看具体例子:例子中省略了很多琐碎的功能,只保留整体的复杂表单框架,用于展示解决方案

方案1: 在一个 vue 文件中

所有的表单项显示隐藏、验证、数据获取、提交、自定义等逻辑放在一起

v-if/v-show
elementui

缺点

  • 还是乱
  • 一个 vue 文件,轻轻松松上 2000 行
  • 在我尝试加入一种新的表单类型时,我发现我已经无。从。下。手。

方案2:分离组件

其实很容易想到 根据不同的表单类型,分离出多个相应类型的子表单 。但我在实践时还是遇到了很多问题: 父子表单验证、整体提交数据的获取 等等,并总结出一套解决方案:

1. 子组件

所有的子组件中都需要包含两个方法 validate 、 getData 供父组件调用。

(1) validate 方法

用于验证本身组件的表单项,并返回一个 promise 对象

vaildate() {
 // 返回`elementUI`表单验证的结果(为`promise`对象)
 return this.$refs["ruleForm"].validate();
},
   

(2) getData 方法

提供子组件中的数据

getData() {
 // 返回子组件的form
 return this.ruleForm;
},

2. 父组件

(1)策略模式

使用策略模式存储并获取 子表单的 ref (用于获取子表单的方法)和 提交函数 。省略了大量的 if-else 判断。

data:{
 // type和ref名称的映射
 typeRefMap: {
 1: "message",
 2: "mail",
 3: "apppush"
 },
 // type和提交函数的映射。不同类型,接口可能不同
 typeSubmitMap: {
 1: data => alert(`短信模板创建成功${JSON.stringify(data)}`),
 2: data => alert(`邮件模板创建成功${JSON.stringify(data)}`),
 3: data => alert(`push模板创建成功${JSON.stringify(data)}`)
 },
}

(2) submit 方法

用于父子组件表单验证、获取整体数据、调用当前类型提交函数提交数据

因为 elementUI 表单验证的 validate 方法可以返回 promise 结果 ,可以利用 promise 的特性来处理父子表单的验证。 比如 then 函数可以返回另一个 promise 对象 、 catch 可以获取它以上所有 then 的 reject 、 Promise.all 。

父表单验证通过才会验证子表单,存在先后顺序

// 父表单验证通过才会验证子表单,存在先后顺序
submitForm() {
 const templateType = this.typeRefMap[this.indexForm.type];
 this.$refs["indexForm"]
 .validate()
 .then(res => {
 // 父表单验证成功后,验证子表单
 return this.$refs[templateType].vaildate();
 })
 .then(res => {
 // 全部验证通过
 // 获取整体数据
 const reqData = {
 // 获取子组件数据
 ...this.$refs[templateType].getData(),
 ...this.indexForm
 };
 // 获取当前表单类型的提交函数,并提交
 this.typeSubmitMap[this.indexForm.type](reqData);
 })
 .catch(err => {
 console.log(err);
 });
},

父表单,子表单一起验证

submitForm1() {
 const templateType = this.typeRefMap[this.indexForm.type];
 const validate1 = this.$refs["indexForm"].validate();
 const validate2 = this.$refs[templateType].vaildate();
 // 父子表单一起验证
 Promise.all([validate1, validate2])
 .then(res => {
 // 都通过时,发送请求
 const reqData = {
 ...this.$refs[templateType].getData(),
 ...this.indexForm
 };
 this.typeSubmitMap[this.indexForm.type](reqData);
 })
 .catch(err => {
 console.log(err);
 });
},

查看在线项目,项目github和组件代码

总结

以上所述是小编给大家介绍的vue+elementUI 复杂表单的验证、数据提交方案问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js之WEB开发调试利器:Firebug 下载
Jan 13 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 Javascript
leaflet的开发入门教程
Nov 17 Javascript
基于ajax与msmq技术的消息推送功能实现代码
Dec 26 Javascript
vue params、query传参使用详解
Sep 12 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
JsChart组件使用详解
Mar 04 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
JavaScript学习笔记之数组基本操作示例
Jan 09 Javascript
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
新手如何快速理解js异步编程
Jun 24 #Javascript
简单了解小程序+node梳理登陆流程
Jun 24 #Javascript
JS数组扁平化(flat)方法总结详解
Jun 24 #Javascript
深入了解query和params的使用区别
Jun 24 #Javascript
如何使用JavaScript实现栈与队列
Jun 24 #Javascript
简单了解JavaScript中的执行上下文和堆栈
Jun 24 #Javascript
一次让你了解全部JavaScript的作用域
Jun 24 #Javascript
You might like
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python2.7安装图文教程
2018/03/13 Python
python 除法保留两位小数点的方法
2018/07/16 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
python开头的coding设置方法
2019/08/08 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Python @property装饰器原理解析
2020/01/22 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
python中使用np.delete()的实例方法
2021/02/01 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
P/Invoke是什么
2015/07/31 面试题
学期自我鉴定范文
2013/10/01 职场文书
毕业生自我推荐
2013/11/04 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
会议活动邀请函
2014/01/27 职场文书
计算机学生求职信范文
2014/01/30 职场文书
总经理工作职责范文
2014/03/14 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python