Vue+Element实现动态生成新表单并添加验证功能


Posted in Javascript onMay 23, 2019

首先有一个这样的需求,表单中默认有一个联系人信息,用户可以再添加新的联系人信息

Vue+Element实现动态生成新表单并添加验证功能

点击添加更多联系人之后

Vue+Element实现动态生成新表单并添加验证功能

官方文档中有写用v-for来实现新增表单,但是那是单表单的新增,现在多表单的新增,可以考虑的实现方法是先写死一个必须的表单,需要新增的两个表单放在一个div里,在div中使用v-for生成,达到同时新增的效果

代码如下

//必填一个联系人的表单
<el-form-item class="rules" label="通知对象:" prop="notifyobject">
      <el-input v-model="ruleForm.notifyobject" placeholder="请输入联系人名称" :disabled="isReadonly" class="el-select_box"></el-input>
     </el-form-item>
     <el-form-item class="rules" label="邮箱:" prop="email">
      <el-input v-model="ruleForm.email" placeholder="请输入邮箱" :disabled="isReadonly" class="el-select_box"></el-input>
     </el-form-item> 
//动态生成的联系人表单
     <div class="moreRules">
      <div class="moreRulesIn" v-for="(item, index) in ruleForm.moreNotifyObject" :key="item.key">
       <el-form-item class="rules" label="通知对象:" :prop="'moreNotifyObject.' + index +'.notifyobject'" :rules="moreNotifyOjbectRules.moreNotifyOjbectName">
        <el-input v-model="item.notifyobject" placeholder="请输入联系人名称" :disabled="isReadonly" class="el-select_box"></el-input>
       </el-form-item>
       <el-form-item class="rules" label="邮箱:" :prop="'moreNotifyObject.'+ index +'.email'" :rules="moreNotifyOjbectRules.moreNotifyOjbectEmail">
        <el-input v-model="item.email" placeholder="请输入邮箱" :disabled="isReadonly" class="el-select_box"></el-input>
       </el-form-item>
       <el-button @click="deleteRules(item, index)" :disabled="isReadonly">删除</el-button>
      </div>
     </div>
     <el-form-item v-show="!isRead">
      <el-button type="text" class="addUser" @click="addUser" :disabled="isReadonly"><i class="iconfont icon-tianjialianxiren"></i>添加更多联系人</el-button>
     </el-form-item>

和普通表单验证不同的是,动态表单要新增自己的验证规则,和添加普通表单的方式一样

ruleForm:{
  //普通表单的验证规则
},
//新增表单的验证规则
   moreNotifyOjbectRules: {
    moreNotifyOjbectName: [{ required: true, message: '请输入联系人名称', trigger: 'blur' },
     {
      validator: (rule, value, callback) => {
       if (value.length > 15 || value.length < 2) {
        callback(new Error('长度必须为2~8个字符'))
       } else {
        var reg = new RegExp("[`~!@#$^&*()=|{}':',\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]")
        if (reg.test(value)) {
         callback(new Error('不能含有特殊字符'))
        } else {
         callback()
        }
       }
      },
      trigger: 'change'
     }
    ],
    moreNotifyOjbectEmail: [{ required: true, message: '请输入邮箱地址', trigger: 'blur' },
     { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
    ]
   }

这里需要注意的是:rules是每个表单都要都要添加的,有多个的话就要给每个表单绑定一个规则

<el-form-item class="rules" label="通知对象:" :prop="'moreNotifyObject.' + index +'.notifyobject'" :rules="moreNotifyOjbectRules.moreNotifyOjbectName">
<el-form-item class="rules" label="邮箱:" :prop="'moreNotifyObject.'+ index +'.email'" :rules="moreNotifyOjbectRules.moreNotifyOjbectEmail">

另外要注意的是:prop,正常表单验证单项是依靠prop,但是动态生成话要用:prop。

书写的语法是:prop="'moreNotifyObject.' + index +'.notifyobject'",moreNotifyObject是v-for绑定的数组,index是索引,notifyobject是表单绑定的v-model的名称,然后用.把他们链接起来。

所以总结起来的语法就是:prop="'v-for绑定的数组.' + index + '.v-model绑定的变量'"

还有一个需要注意就是v-for的写法,要将表单的model名写进去

<div class="moreRulesIn" v-for="(item, index) in ruleForm.moreNotifyObject" :key="item.key">

还有要注意的就是v-for绑定的数组也要在表单的对象里,写在表单对象外是验证不了的,在data里添加

ruleform:{
  moreNotifyObject: [{
     notifyobject: '',
     email: ''
    }]
}

然后新增联系人的函数应该这样写

addUser() {
   this.ruleForm.moreNotifyObject.push({
    notifyobject: '',
    email: ''
   })
  }

同理删除联系人也是

deleteRules(item, index) {
   this.index = this.ruleForm.moreNotifyObject.indexOf(item)
   if (index !== -1) {
    this.ruleForm.moreNotifyObject.splice(index, 1)
   }
  }

如果一开始只想让默认必填的表单显示,而新增的不显示,如文章最开头的表现一样,则可以在methods中初始化v-for绑定的数组

methods:{
  //初始化数据
  initData(){
    this.ruleFrom.moreNotifyObject = []
  }}

总结

以上所述是小编给大家介绍的Vue+Element实现动态生成新表单并添加验证功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
复制本贴标题和地址的js代码
Jul 01 Javascript
在Javascript里访问SharePoint列表数据的实现方法
May 22 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
Jun 08 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
a标签置灰不可点击的实现方法
Feb 06 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
Sep 14 Javascript
layer.open关闭父窗口 以及调用父页面的方法
Aug 17 Javascript
vue elementui el-form rules动态验证的实例代码详解
May 23 #Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 #Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 #Javascript
微信小程序开发实现消息推送
Nov 18 #Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 #jQuery
js打开word文档预览操作示例【不是下载】
May 23 #Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 #Javascript
You might like
简单的cookie计数器实现源码
2013/06/07 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
Python抽象和自定义类定义与用法示例
2018/08/23 Python
有关Python的22个编程技巧
2018/08/29 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
基于Python测试程序是否有错误
2020/05/16 Python
python如何编写win程序
2020/06/08 Python
python定时截屏实现
2020/11/02 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
心得体会怎么写
2013/12/30 职场文书
电钳专业个人求职信
2014/01/04 职场文书
简短大学毕业感言
2014/01/18 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
党员干部一句话承诺
2014/05/30 职场文书
承诺书格式范文
2014/06/03 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
指导老师鉴定意见
2015/06/05 职场文书
mysql查看表结构的三种方法总结
2022/07/07 MySQL