最近遇到了一个关于$ref的问题。
业务场景:
多页签表单,提交时需要先判断几个表单必填是否完整,
在原来vue2项目中,在父组件electionIndex.vue组件中通过以下代码获取请问以便提示
源代码如下
//组件关系如下:electionIndex->dbInfo=>dbAside,dbBasicInfo,dbElection
let asideFlag = this.$refs.dbInfo.$refs.dbAside.validataForm()
let basicFlag = this.$refs.dbInfo.$refs.dbBasicInfo.validataForm()
let electionFlag = this.$refs.dbInfo.$refs.dbElection.validataForm()
但是由于新单机版系统由vue3+ts搭建,vue3不支持vue2的refs方法,
因此上述代码,无法调用孙组件中的方法
解决办法如下:
//getCurrentInstance能得到组件中的proxy,进而拿到$refs
import {getCurrentInstance} from 'vue'
this.proxyElection=getCurrentInstance();
//子组件依然需要上述步骤
将上面代码改为:
let asideFlag = this.proxyElection.proxy.$refs['dbInfo'].proxyDbInfo.proxy.$refs.dbAside.validataForm()
let basicFlag = this.$refs.dbInfo.$refs.dbBasicInfo.validataForm()
let electionFlag = this.$refs.dbInfo.$refs.dbElection.validataForm()
//发现不好使。
发现这几个方法都是dbinfo下的子组件,于是,去掉上述代码,在dbInfo中这样写:
async getChildMethods(){
let obj={
asideFlag:false,
basicFlag:false,
electionFlag:false,
}
await this.proxyDbInfo.proxy.$refs['dbAside'].validataForm()==true?obj.asideFlag=true:false
await this.proxyDbInfo.proxy.$refs['dbBasicInfo'].validataForm()==true?obj.basicFlag=true:false
await this.proxyDbInfo.proxy.$refs['dbElection'].validataForm()==true?obj.electionFlag=true:false
return {...obj}
},
在electionIndex中调用并解构
let { asideFlag, basicFlag, electionFlag } =
await this.proxyy.proxy.$refs["dbInfo"].getChildMethods();
需要注意的是,表单校验是异步的,所有调用都需要加async、await
async validataForm() {
let flag = null
await this.proxyElection.proxy.$refs['dbElectionForm'].validate(valid => {
if (valid) {
flag = true
} else {
flag = false
}
})
return flag
}
圆满解决