vant(ZanUi)结合async-validator实现表单验证的方法
最近在开发一个移动端商城项目,用到了有赞的vant,因为最近大都采用elementui在做PC端的东西,对比来说,vant的完成度还是偏低了点,很多细节都虽然都实现了接口,但是想使用得自己去想办法,没办法拿来即用。昨天用到Uploader图片上传如是,提供了file回调,却没有提供上传功能,我必须给他加2个函数实现axios提交才能用,还有今天用到表单验证这块,它的Field组件虽然给了error-message的错误提示接口,但是没有内置表单验证功能。
elementui采用async-validator实现表单验证,我也基于这个组件进行扩展,async-validator不支持细粒化验证,于是先对它进行扩展
validator.js
importasyncValidatorfrom'async-validator'
classvalidator{
/**
*构造
*@paramrulesobjectasync-validatorrules
*@paramdata初始对象
*/
constructor(rules,data){
this.setData(data);
this.setRules(rules);
}
/**
*重新定义初始对象
*也可以直接修改实例的data
*validator.data=newData
*@paramdata
*/
setData(data){
this.data=data;
}
/**
*设定规则
*@paramrulesrulesobjectasync-validatorrules
*@paramcover是否替换旧规则
*/
setRules(rules,{cover}={}){
if(cover===undefined||cover){
this.validators={};
}
for(letattrinrules){
construle={};
rule[attr]=rules[attr];
this.validators[attr]=newasyncValidator(rule);
}
}
/**
*执行验证
*@paramcallback(errors,fields)
*@paramdata可选传空将验证构造data传string或数组验证构造data的响应字段
*以上参数顺序可互转
*/
validate(callback,data){
letcb,d;
if(typeofcallback==='function'){
cb=callback;
d=data;
}elseif(typeofdata==='function'){
cb=data;
d=callback;
}
let_d=d;
if(this.data){
if(!d){
_d=this.data;
}elseif(typeofd==='string'){
_d={};
_d[d]=this.data[d]
}elseif(Array.isArray(d)){
_d={};
d.forEach(attr=>{
_d[attr]=this.data[attr]
})
}
}
consterr=[];
if(_d){
for(letattrin_d){
if(this.validators[attr]){
consto={};
o[attr]=_d[attr];
this.validators[attr].validate(o,(error)=>{
if(error){
err.push(error[0])
}
})
}
}
}
cb&&cb(err.length>0,err)
}
}
exportdefaultfunction(rules,data){
returnnewvalidator(rules,data)
}
demo.vue
{{countdown?countdown+'s':'发送'}} 立即注册 重置
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。