本篇文章小编给大家分享一下Vue两个字段联合校验之修改密码功能代码实现,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
1、前言
在修改密码时,一般需要确认两次密码一致,涉及2个属性字段。类似的涉及2个属性字段的情况有:
日期时间范围,如果两者都有值,则要求:结束时间>=开始时间。
数量关系:数量下限<=数量上限。
特点是两个属性值都是可变的。本文以校验两次密码的一致性应用,给出两个可变属性值的字段之间的联合校验的典型解决方案。
2、方案实现
2.1、实现代码
先给出表单的代码:
用户管理 / 修改密码
确定 取消
导入的外部校验器passwordValidator在/src/common/validator.js文件中,代码如下:
/* 密码校验 */ export function passwordValidator(rule, value, callback) { const reg =/^[_a-zA-Z0-9@.#%&*!-$^]+$/; if(value == '' || value == undefined || value == null){ callback(); } else { if (!reg.test(value)){ callback(new Error('密码由英文字母、数字以及下列字符组成:@.#%&*!_-$^')); } else { callback(); } } }
2.2、代码说明
2.2.1、规则配置:
// 校验规则配置 rules: { oldPasswd : [ {required: true, message: "密码不能为空", trigger: 'blur'} ], newPasswd : [ {required: true, message: "新密码不能为空", trigger: 'blur'}, {min: 6, max: 18, message: "新密码6-18位", trigger: 'blur'}, {validator: passwordValidator, trigger: 'blur'}, {validator: comparePasswdValidator,trigger: 'blur','getValuesMethod':this.getValuesMethod}, ], confirmPasswd : [ {required: true, message: "确认密码不能为空", trigger: 'blur'}, {min: 6, max: 18, message: "确认密码6-18位", trigger: 'blur'}, {validator: passwordValidator, trigger: 'blur'}, {validator: comparePasswdValidator,trigger: 'blur','getValuesMethod':this.getValuesMethod}, ], },
重点是newPasswd和confirmPasswd属性,两个配置了相同的规则集,校验规则都为:
值不能为空。
长度为6-18位。
符合密码校验器passwordValidator的规则,即密码由英文字母、数字以及下列字符组成:@.#%&*!_-$^。
比较密码校验器comparePasswdValidator,这个校验器添加了一个自定义属性getValuesMethod,属性值为this的getValuesMethod方法,注意是方法,不是方法名。该条规则,要求methods中有一个getValuesMethod方法,并且实现comparePasswdValidator校验器。
这些规则一起作用,所有规则都通过校验,属性校验才通过,并且检测次序按照数组的先后次序执行。
校验规则中,newPasswd和confirmPasswd属性,都配置相同的comparePasswdValidator,是因为两个字段属性值都是可变的。comparePasswdValidator排在规则的最后一条,即需要先满足前面的校验规则。
2.2.2、getValuesMethod方法
// 获取值的方法,为所有需要多字段联合校验的校验器使用 getValuesMethod(){ return this.form; },
getValuesMethod方法,返回data中form数据对象。这是一个很犀利的操作,相当于提供了全局的数据探针,可以在校验器中访问data的form数据对象,并且由于form的v-modal模型,确保数据的实时性,即无需担心获取不到其它属性的最新取值。getValuesMethod方法,提供了数据绑定的另类思路。
2.2.3、comparePasswdValidator校验器
// 比较两次密码是否相同 const comparePasswdValidator = (rule, value, callback) =>{ // 获取获取值的方法 var getvaluesMethod = rule.getValuesMethod; // 调用getvaluesMethod方法,获取对象值 var formData = getvaluesMethod(); // 有一个为空,可能还没有输入值,此时不比较 if (formData.newPasswd == '' || formData.confirmPasswd == ''){ return callback(); } // =========================================================== // 比较两次密码 // 两个都有值,比较 if (formData.newPasswd == formData.confirmPasswd){ // 新密码与确认密码一致 // 先清除两个密码的校验告警提示,目前是清除另一个密码的不一致的提示 this.$refs['form'].clearValidate(['newPasswd','confirmPasswd']); callback(); }else{ callback(new Error('两次密码不一致')); } }
因为配置的自定义规则属性'getValuesMethod'是一个指向this.getValuesMethod的方法,因此该属性可以看作方法来调用:
// 获取获取值的方法 var getvaluesMethod = rule.getValuesMethod; // 调用getvaluesMethod方法,获取对象值 var formData = getvaluesMethod();
方法属性的调用结果,返回了指向this.form的数据对象,于是就可以随意访问该对象的属性。
在比较两者之前,如果发现有一者为空,则返回。因为当前属性输入值之后,对端属性可能还没有输入值,此时不应该比较。
// 有一个为空,可能还没有输入值,此时不比较 if (formData.newPasswd == '' || formData.confirmPasswd == ''){ return callback(); }
两次密码比较:
// =========================================================== // 比较两次密码 // 两个都有值,比较 if (formData.newPasswd == formData.confirmPasswd){ // 新密码与确认密码一致 // 先清除两个密码的校验告警提示,目前是清除另一个密码的不一致的提示 this.$refs['form'].clearValidate(['newPasswd','confirmPasswd']); callback(); }else{ callback(new Error('两次密码不一致')); }
两次密码比较,如果两个密码一致,就输出告警提示。如果一致,则需要先清除对端的告警提示,因为此时对端可能有”两次密码不一致“的提示。
// 先清除两个密码的校验告警提示,目前是清除另一个密码的不一致的提示 this.$refs['form'].clearValidate(['newPasswd','confirmPasswd']);
clearValidate方法,是element-form的方法,作用是清除一个或多个校验规则属性的异常提示。
这时,是否会发生”误杀“情况呢?即清除操作将对端的其它异常提示也清除了。考虑到此时两次密码相同,且两者校验规则是相同的,由于此校验规则排在最后,从检测次序来说,是最后执行的,也就是说,执行到本校验器时,其它校验都通过了。因此,这种”误杀“的情况不会发生。实际执行效果也是如此。
另外,需要注意的,此时不能用下列代码代替上面clearValidate调用语句:
// 执行对端的校验 if (rule.field == 'newPasswd') { // 如果当前属性为newPasswd this.$refs['form'].validateField('confirmPasswd'); }else{ this.$refs['form'].validateField('newPasswd'); }
因为,此时正在执行校验,再调用对端校验,会导致对端调用comparePasswdValidator,而对端校验结果发现两次密码一致,将再次调用对端(对端的对端,即本身)校验,于是死循环了,导致调用堆栈溢出。因此,校验器代码中,尽量不要再调用validateField方法。
2.3、校验效果
下面是一些效果图:
初始状态:
修改确认密码,离开输入焦点:
进入新密码输入框,不输入,离开输入焦点:
修改确认密码,删除尾部的字符"8",离开输入焦点,此时又回到了初始状态。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整