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 相关文章推荐
javascript中字符串拼接需注意的问题
Jul 13 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
全面了解js中的script标签
Jul 04 Javascript
canvas实现环形进度条效果
Mar 23 Javascript
JS验证输入的是否是数字及保留几位小数问题
May 09 Javascript
Puppet的一些技巧
Sep 17 Javascript
vue slot与传参实例代码讲解
Apr 28 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
js实现图片上传即时显示效果
Sep 30 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
PHP 加密解密内部算法
2010/04/22 PHP
关于PHP中Object对象的笔记分享
2011/06/28 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
Python变量赋值的秘密分享
2018/04/03 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
django实现类似触发器的功能
2019/11/15 Python
python连接PostgreSQL过程解析
2020/02/09 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
python下载的库包存放路径
2020/07/27 Python
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
普通党员个人对照检查材料
2014/09/18 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
2015年新学期寄语
2015/02/26 职场文书
运动会广播稿300字
2015/08/19 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
Pandas数据类型之category的用法
2021/06/28 Python