详解element-ui中表单验证的三种方式


Posted in Javascript onSeptember 18, 2019

最近项目中一直使用的element-ui作为前端框架,对于最常使用的表单验证,做出以下总结:

第一种常用方式:表单上加rules{object}

<el-form class="apply-form first-form" :model="formData" :rules="rule" ref="form">
  <el-form-item label="姓名" prop="visitorName">
    <el-input v-model="formData.visitorName" placeholder="请输入姓名" clearable></el-input>
  </el-form-item>
  <el-form-item label="身份证号" prop="cardCode">
    <el-input v-model="formData.cardCode" :maxlength="18" placeholder="请输入身份证号" clearable></el-input>
  </el-form-item>
</el-form>

这种方式需要在data()中写入rule{},对于需要校验字段prop中的如visitorName写上验证规则,如下:

data() {
  return {
    formData: {
      visitorName: '',
      cardType: 1,
      cardCode: ''
    },
    rule: {
      visitorName: [
        { required: true, message: '请输入姓名', trigger: 'blur' },
        { min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur' },
        {
            required: true,
            pattern: /^[\u4e00-\u9fa5_a-zA-Z0-9.·-]+$/,
            message: '姓名不支持特殊字符',
            trigger: 'blur'
        }
     ],
     cardCode: [
       { required: true, message: '请输入身份证号', trigger: 'blur' },
       { min: 15, max: 18, message: '请如实填写18位号码,以供学校保卫科核对', trigger: 'blur' },
       {
          required: true,
          pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
          message: '请输入正确的身份证号码',
          trigger: 'blur'
       }
     ]
   }
  }
}

其中对于有些需要自定义的校验规则可以作为变量写在data中:

data() {
  let reg = /(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)$)^[\w~!@#$%^&*?]{6,12}$/
  var validateNewPwd = (rule, value, callback) => {
    if (!reg.test(value)) {
      callback(new Error('密码应是6-12位数字、字母或字符!'))
    } else if (this.form.oldPasswd === value) {
      callback(new Error('新密码与旧密码不可一致!'))
    } else {
      callback()
    }
  }
  var validateComfirmPwd = (rule, value, callback) => {
    if (!reg.test(value)) {
      callback(new Error('密码应是6-12位数字、字母或字符!'))
    } else if (this.form.newPasswd !== value) {
      callback(new Error('确认密码与新密码不一致!'))
    } else {
      callback()
    }
  }
  return {
    form: {
      newPasswd: '',
      comfirmPwd: ''
    },
    rules: {
      newPasswd: [
        { required: true, message: '请输入新密码', trigger: 'blur' },
        { validator: validateNewPwd, trigger: 'blur' }
      ],
      comfirmPwd: [
        { required: true, message: '请输入确认密码', trigger: 'blur' },
        { validator: validateComfirmPwd, trigger: 'blur' }
      ]
    }
  }
}

比较适用于表单全部字段校验或需要校验字段类型比较简单的数据类型

第二种方式:在el-form-item单个添加

<el-form-item label="电话号码" class="el-form-item--small has-error" :prop="phoneNum" :rules="[{ required: true, message: '请输入电话号码', trigger: 'blur' }, { required: true, pattern: /^((13|14|15|16|17|18)[0-9]{1}\d{8})|((166|199|198)[0-9]{1}\d{7})$/, message: '请输入正确的电话号码', trigger: 'blur' }]">
  <el-input v-model="v.phoneNum" :maxlength="11" placeholder clearable></el-input>
</el-form-item>

这种方式适用于需要个别检验的字段,或者表单字段有变动的校验;

第三种方式:动态增减表单项

先看需求效果图

详解element-ui中表单验证的三种方式

对应的数据结构:

详解element-ui中表单验证的三种方式

对应删除增加表单项的操作为:

addPhone() {
  let len = this.formData.phoneInfoList.length
  this.$set(this.formData.phoneInfoList, len, {
    relation: [],
    phoneNum: '',
    relationType: 0,
    schoolId: this.selectedUser.schoolId,
    userCode: this.selectedUser.userCode
  })
},
deletePhone(item) {
  if (this.formData.phoneInfoList.length > 1) {
    // 表示先获取这个元素的下标,然后从这个下标开始计算,删除长度为1的元素
    this.formData.phoneInfoList.splice(this.formData.phoneInfoList.indexOf(item), 1);
  } else {
    this.$vux.toast.text('至少保留一个家长亲情号码!')
    return false
  }
},

这样的rule、prop直接写就对应不上表单mode绑定的对象上的属性,所以在此要用循环的方式找到要校验的字段所在数据中的索引,然后再以字符串拼接的方式连上校验字段名称:

详解element-ui中表单验证的三种方式

渲染出来的html为:

详解element-ui中表单验证的三种方式

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
jQuery处理图片加载失败的常用方法
Jun 08 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
Highcharts学习之数据列
Aug 03 Javascript
JS中判断null的方法分析
Nov 21 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
Nov 15 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 #Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 #Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 #Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
Sep 18 #Javascript
解决layer 动态加载select 失效的问题
Sep 18 #Javascript
webpack的tree shaking的实现方法
Sep 18 #Javascript
js实现窗口全屏示例详解
Sep 17 #Javascript
You might like
PHP编实现程动态图像的创建代码
2008/09/28 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
浅析python的优势和不足之处
2018/11/20 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
python list的index()和find()的实现
2020/11/16 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
世界上最伟大的马产品:Equiderma
2020/01/07 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
什么是servlet
2012/05/08 面试题
期中考试后的反思
2014/02/08 职场文书
岗位职责风险点
2014/03/12 职场文书
交通事故委托书范本
2014/09/28 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python