详解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 相关文章推荐
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
jQuery中:visible选择器用法实例
Dec 30 Javascript
在JavaScript中使用NaN值的方法
Jun 05 Javascript
简单讲解jQuery中的子元素过滤选择器
Apr 18 Javascript
分享一个插件实现水珠自动下落效果
Jun 01 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
Oct 26 Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
Jul 20 Javascript
Vue elementui字体图标显示问题解决方案
Aug 18 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
建立动态的WML站点(二)
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
python进行文件对比的方法
2018/12/24 Python
使用python制作一个解压缩软件
2019/11/13 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python模拟斗地主发牌
2020/04/22 Python
python实现在线翻译
2020/06/18 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
清洁工岗位职责
2014/01/29 职场文书
财务工作失职检讨书
2014/11/21 职场文书
晚会开幕词
2015/01/28 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers