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 相关文章推荐
js实现瀑布流的一种简单方法实例分享
Nov 04 Javascript
Javascript全局变量var与不var的区别深入解析
Dec 09 Javascript
简述Matlab中size()函数的用法
Mar 20 Javascript
Bootstrap模块dropdown实现下拉框响应
May 22 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 Javascript
js基本算法:冒泡排序,二分查找的简单实例
Oct 08 Javascript
浅谈Vue的基本应用
Dec 27 Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
Jul 10 Javascript
react 路由Link配置详解
Nov 11 Javascript
vue+elementUI实现表格列的显示与隐藏
Apr 13 Vue.js
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
一个好用的PHP验证码类实例分享
2013/12/27 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
理解Javascript闭包
2013/11/01 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
用Python写冒泡排序代码
2016/04/12 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
python二维图制作的实例代码
2020/12/03 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
股东合作协议书范本
2014/04/14 职场文书
亚运会口号
2014/06/20 职场文书
荒岛余生观后感
2015/06/09 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
Python实现打乒乓小游戏
2021/09/25 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers