视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue elementui form表单验证的实现
2020-11-27 22:04:02 责编:小采
文档

最近我们公司将前端框架由easyui 改为 vue+elementui 。自学vue两周 就开始了爬坑之路。业余时间给大家分享一下心得,技术新手加上第一次分享(小激动),有什么不足的地方欢迎大家指正,多多交流才能共同进步!

1.问题 我们公司的项目比较大 表格 表单的页面都不胜数 ,基于此封装了一些 可复用的代码。

2.分析  vue给了我们不一样的前端代码体验  element ui 给我们一套功能强大的组件 减少了我们大量的开发时间 。双剑合璧 天下无敌!  但每个公司的代码风格不同  用户的要求也比较端 ui团队设计完美 我们怎样才能用这个两把剑闯出自己的江湖 就需要大家好好琢磨了。

废话不多说!进入正题

form表单验证规则的封装

1.ellementui的处理    1. Form 组件上一次性传递所有的验证规则  2 .单个的表单域上传递属性的验证规则 。

<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
 <el-form-item
 prop="email"
 label="邮箱"
 :rules="[
 { required: true, message: '请输入邮箱地址', trigger: 'blur' },
 { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur,change' }
 ]"
 >
 <el-input v-model="dynamicValidateForm.mobil"></el-input>
 </el-form-item>
 <el-form-item 
 label="姓名:" 
 prop="name" 
 :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]">
 <el-input v-model="dynamicValidateForm.name"></el-input>
</el-form-item>
<el-form-item label="手机号:" prop="mobil" 
 :rules="filter_rules({required:true,type:'mobile'})">
 <el-input v-model="dynamicValidateForm.mobil"></el-input>
</el-form-item>

</el-form>

观察上面的代码 有一个共性 单个的表单域上传递属性的验证规则 ,给rules 属性一个数组

重点来了 19行代码是什么意思????

这就是我们封装的全局可复用的方法   传入需要的参数,你就可以得到你想要的验证规则 rules 数组

在我们的工具包建一个 js文件  我们的全局方法就有了

exports.install = function (Vue, options) {

 Vue.prototype.filter_rules = function (item){ 
 
 return [{},{}]
 
 }
 

}

还要在main.js 中注册

下面分享下我的js文件

import { validateMoneyNumber,qq,mobile,regexn,integer} from '@/utils/validate'

exports.install = function (Vue, options) {
 
 
 /**
 * 注意: 定义type 规则时 不用做非空验证 
 * 只需要传入 required:true 即可
 * */
 /*保留两位小数*/
 const isvalidateMoney = (rule, value, callback) => {
 if(value != null && value != "") {
 if(!validateMoneyNumber(value)) {
 callback(new Error('请输入正确的数字,最多保留两位小数!'))
 } else {
 callback()
 }
 }
 else{
 callback();
 }
 }
 /*验证QQ号码*/
 const isvalidateQQ= (rule, value, callback) => { 
 if(value != null && value != "") {
 if(!qq(value)) {
 callback(new Error('您输入的QQ号不正确!'))
 } else {
 callback()
 }
 }
 else{
 callback();
 }
 }
 /*验证手机号*/
 const isvalidateMobile= (rule, value, callback) => { 
 if(value != null && value != "") {
 if(!mobile(value)) {
 callback(new Error('您输入的手机号不正确!'))
 } else {
 callback()
 }
 }
 else{
 callback();
 }
 }
 
 /*含有非法字符(只能输入字母、汉字)*/
 const isvalidateRegexn= (rule, value, callback) => { 
 if(value != null && value != "") {
 if(!regexn(value)) {
 callback(new Error('含有非法字符(只能输入字母、汉字)!'))
 } else {
 callback()
 }
 }
 else{
 callback();
 }
 }
 /*请输入正整数*/
 const isvalidateInteger= (rule, value, callback) => { 
 if(value != null && value != "") {
 if(!integer(value)) {
 callback(new Error('请输入正整数!'))
 } else {
 callback()
 }
 }
 else{
 callback();
 }
 }
 
 
 
 
 /**
 * 参数 item 
 * required true 必填项
 * maxLength 字符串的最大长度
 * min 和 max 必须同时给 min < max type=number
 * type 手机号 mobile
 * 邮箱 email
 * 网址 url 
 * 各种自定义类型 定义在 src/utils/validate 中 持续添加中.......
 * */
 
 Vue.prototype.filter_rules = function (item){
 let rules = [];
 if(item.required){
 rules.push({ required: true, message: '该输入项为必填项!', trigger: 'blur' });
 }
 if(item.maxLength){
 rules.push({ min:1,max:item.maxLength, message: '最多输入'+item.maxLength+'个字符!', trigger: 'blur' })
 }
 if(item.min&&item.max){ 
 rules.push({ min:item.min,max:item.max, message: '字符长度在'+item.min+'至'+item.max+'之间!', trigger: 'blur' })
 }
 if(item.type){
 let type = item.type;
 switch(type) {
 case 'email':
 rules.push({ type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur,change' });
 break;
 case 'qq':
 rules.push( { validator: isvalidateQQ, trigger: 'blur,change' });
 break;
 case 'mobile':
 rules.push( { validator: isvalidateMobile, trigger: 'blur,change' });
 break; 
 case 'regexn':
 rules.push( { validator: isvalidateRegexn, trigger: 'blur,change' });
 break; 
 case 'integer':
 rules.push( { validator: isvalidateInteger, trigger: 'blur,change' });
 break; 
 default:
 rule.push({});
 break;
 }
 }
 
 
 return rules;
 };
};

看明白了吗  第一行  是引入各种正则表达式   然后自定义校验规则    。  传入你自定义的参数 就可以拿到你想要的规则   (很熟悉吧  参考 easyui 表单验证)

下面是效果

ElementUi rules表单验证

  • 可以在pattern中书写正则,并且配合elementUI进行表单验证。
  • pattern 属性规定用于验证输入字段的模式。模式指的是正则表达式。
  • rules: {
     name:[{
     required: true,
     message: '请输入用户名',
     trigger: 'blur'
     },{
     min: 2,
     max: 5,
     message: '长度在 2 到 5 个字符'
     },{
     pattern: /^[\u4E00-\u9FA5]+$/,
     message: '用户名只能为中文'
     }
     //{ pattern:/^[a-zA-Z]w{1,4}$/, message: '以字母开头,长度在2-5之间, 只能包含字符、数字和下划线'}
     ],
     password: [{
     required: true,
     message: '请输入密码',
     trigger: 'blur'
     }, {
     min: 6,
     max: 30,
     message: '长度在 6 到 30 个字符'
     }, {
     pattern: /^(\w){6,20}$/,
     message: '只能输入6-20个字母、数字、下划线'
     }],
     mobile:[{ 
     required: true,
     message: '请输入手机号码',
     trigger: 'blur'
     },
     {validator:function(rule,value,callback){
     if(/^1[34578]\d{9}$/.test(value) == false){
     callback(new Error("请输入正确的手机号"));
     }else{
     callback();
     }
     }, trigger: 'blur'}
     ],
     // pattern: /^1[34578]\d{9}$/, message: '目前只支持中国的手机号码' }
     peopleID:[{
     required: true,
     message: '请输入身份证ID',
     trigger: 'blur'
     },{
     pattern:/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '你的身份证格式不正确' 
     }
     ],
     carId:[
     {required: true, message: '请输入车牌号', trigger: 'blur'}, 
     {pattern:/(^[\u4E00-\u9FA5]{1}[A-Z0-9]{6}$)|(^[A-Z]{2}[A-Z0-9]{2}[A-Z0-9\u4E00-\u9FA5]{1}[A-Z0-9]{4}$)|(^[\u4E00-\u9FA5]{1}[A-Z0-9]{5}[挂学警军港澳]{1}$)|(^[A-Z]{2}[0-9]{5}$)|(^(08|38){1}[A-Z0-9]{4}[A-Z0-9挂学警军港澳]{1}$)/,
     message: '常规格式:晋B12345'},
     ],
    },
    

    下载本文
    显示全文
    专题