详解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 相关文章推荐
js对象数组按属性快速排序
Jan 31 Javascript
一个简单的JS鼠标悬停特效具体方法
Jun 17 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 Javascript
使用原生js写ajax实例(推荐)
May 31 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
vue elementui el-form rules动态验证的实例代码详解
May 23 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
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脚本数据库功能详解(上)
2006/10/09 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
javascript整除实现代码
2010/11/23 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
城建学院毕业生自荐信
2014/01/31 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
PHP命令行与定时任务
2021/04/01 PHP
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python