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实现的map方法示例代码
Jan 13 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
Jan 09 Javascript
轮播图组件js代码
Aug 08 Javascript
自制微信公众号一键排版工具
Sep 22 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
Sep 23 Javascript
JavaScript中常用的验证reg
Oct 13 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
微信内置浏览器图片查看器的代码实例
Oct 08 Javascript
使用 JavaScript 制作页面效果
Apr 21 Javascript
新手如何快速理解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
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
js读取本地文件的实例
2017/12/22 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
python实现的文件同步服务器实例
2015/06/02 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Keras搭建自编码器操作
2020/07/03 Python
大学考试作弊检讨书
2014/01/30 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
小学庆六一主持词
2015/06/30 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL