写前端项目时vue表单验证突然变成异步了,导致如果获取校验函数的返回值,应该是升级iview组件导致的,这里记录一下改为同步的一种写法
实现功能:表单中进行规则设置,当触发提交或者流程中的下一页时触发这些规则校验
表单
<Form ref="businessInfo" :model="businessInfo" :rules="businessInfoRule" :label-width="120"> <Row> <Col span="8"> <Col span="22"> <FormItem label="业务信息:" prop="objectInfo"> <!-- {{sendData.busnissMsg}} --> <Input v-model="businessInfo.objectInfo" placeholder="具体使用集群的业务名称"></Input> </FormItem> </Col> </Col> <Col span="8"> <Col span="22"> <FormItem label="OP:" prop="op"> <Input v-model="businessInfo.op" placeholder="产品线OP"></Input> </FormItem> </Col> </Col> <Col span="8"> <Col span="22"> <FormItem label="项目邮件组:" prop="mailGroup"> <Input v-model="businessInfo.mailGroup" placeholder="邮箱地址"></Input> </FormItem> </Col> </Col> </Row> </Form>
规则在data中设置
- 子key的名字和上述表单子项的prop设置的名字要一样
businessInfoRule:{ op:[ {required:true,message: '请填写业务op',trigger: 'change'} ], mailGroup:[ {required:true,type:'email',message: '请正确填写邮箱信息',trigger: 'change'}, ], note:[ {required:true,message: '请填写业务用途',trigger: 'change'}, {max:30,message: '请限制在30个字范围内',trigger: 'change'} ], objectInfo:[ {required:true,message: '请填写业务信息',trigger: 'change'}, ] },
规则校验的函数以及调用函数
- Promise是内置的函数
-
this.checkForm().then(res=> 这里的res是checkForm函数返回的结果集
- 通过Promis和this.checkForm().then(res=>这种调用方法实现同步调用,即当checkForm执行完毕后才会进入下一逻辑
checkForm(){ return new Promise((resolve, reject) => { this.$refs['businessInfo'].validate((valid) => { console.log('inner') console.log(valid) if (valid) { resolve(true) } else { this.$Message.error('请检查业务及归属信息'); checkResult = false resolve(false) } }) }) }, changeCrrentPage(){ this.checkForm().then(res=>{ if (res){ console.log(res) this.defaultPage = page; this.$refs.flowApply.changePage(page) } }) break }
错误的写法
- 以前均是采用此中方法进行校验,但是升级了iview组件之后此方法不在生效,在调用checkForm函数时其变为了异步方式,即if(this.checkForm()) 这里的返回时undefined
checkForm(){ return new Promise((resolve, reject) => { this.$refs['businessInfo'].validate((valid) => { console.log('inner') console.log(valid) if (valid) { return(true) } else { this.$Message.error('请检查业务及归属信息'); return false } }) }) }, changeCrrentPage(){ if (this.checkForm()) { this.defaultPage = page; this.$refs.flowApply.changePage(page) } break }