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实现两个大数(整数)相乘
Apr 28 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 Javascript
JavaScript隐式类型转换代码实例
May 29 Javascript
webpack的移动端适配方案小结
Jul 25 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实现文件上传二法
2006/10/09 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python优先队列实现方法示例
2017/09/21 Python
Sanic框架配置操作分析
2018/07/17 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
python函数不定长参数使用方法解析
2019/12/14 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python join()函数原理及使用方法
2020/11/14 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
购买一个高级域名:BuyDomains
2018/03/11 全球购物
init进程的作用
2015/08/20 面试题
建筑设计师岗位职责
2013/11/18 职场文书
村官学习十八大感想
2014/01/15 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
名人演讲稿范文
2014/09/16 职场文书
教师学期个人总结
2015/02/11 职场文书
行政经理岗位职责
2015/04/15 职场文书
校园开放日新闻稿
2015/07/17 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
Python基础之变量的相关知识总结
2021/06/23 Python