vue 表单验证由异步变更为同步

写前端项目时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  
}
原文地址:https://www.cnblogs.com/Bccd/p/13268138.html