详解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 相关文章推荐
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
js获取ajax返回值代码
Apr 30 Javascript
jQuery获取多种input值的简单实现方法
Jun 20 Javascript
总结Node.js中的一些错误类型
Aug 15 Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 Javascript
js实现符合国情的日期插件详解
Jan 19 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
Apr 11 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
May 07 Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
javascript实现时钟动画
2020/12/03 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
简单的Python2.7编程初学经验总结
2015/04/01 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
使用Python pip怎么升级pip
2020/08/11 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
三年级学生期末评语
2014/12/26 职场文书
党支部意见范文
2015/06/02 职场文书
招商银行工作证明
2015/06/17 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang