解决vue3+ts,内嵌vue2代码,无法使用$refs的问题

2 篇文章 0 订阅

最近遇到了一个关于$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
    }

圆满解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值