You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中v-if控制组件的$refs返回undefined问题排查求助

问题排查与修复方案

核心错误原因

你的代码存在两个关键问题,导致无法正确获取组件的$refs:

1. ref绑定语法错误

模板中给组件使用了:ref="leaders"和:ref="opportunities",带冒号的:ref是响应式变量绑定,但你的data里并没有定义leaders、opportunities这两个变量,Vue会将它们识别为undefined,因此不会给组件注册对应的ref名称。

正确写法是直接使用字符串形式的ref(不带冒号):

<LeadsResults v-if="reporting.type == 'yes'" ref="leaders"></LeadsResults>
<OpportunitiesResults v-if="reporting.type == 'no'" ref="opportunities"></OpportunitiesResults>

2. 异步DOM更新导致的时机问题

Vue修改数据后,DOM更新是异步执行的。当reporting.type变化时,watch回调会立即触发,但此时对应的组件还未完成渲染挂载,$refs自然无法获取到组件实例。

解决方法是使用this.$nextTick(),等待DOM更新完成后再访问ref:

watch: {
  'reporting.type': function (value) {
    this.$nextTick(() => {
      if (value == 'yes') {
        console.log(this.$refs.leaders)
      } else if (value == 'no') {
        console.log(this.$refs.opportunities)
      }
    })
  }
}

完整修复代码

<template>
  <div>
    <v-card>
      <v-form :model='reporting' ref='reportingForm'>
        <v-radio-group v-model="reporting.type"
                        :mandatory="true"
                        class="referral-radios">
          <v-radio label="True" :value="'yes'" class="referral-radio"></v-radio>
          <v-radio label='False' :value="'no'" class="referral-radio"></v-radio>
        </v-radio-group>
      </v-form>
    </v-card>
    <div>
      <LeadsResults v-if="reporting.type == 'yes'" ref="leaders"></LeadsResults>
      <OpportunitiesResults v-if="reporting.type == 'no'" ref="opportunities"></OpportunitiesResults>
    </div>
  </div>
</template>

<script>
import LeadsResults from 'views/leads_results.vue'
import OpportunitiesResults from 'views/opportunities_results.vue'
export default {
  components: {
    LeadsResults,
    OpportunitiesResults,
  },
  data () {
    return {
      reporting: {
        type: ''
      }
    }
  },
  watch: {
    'reporting.type': function (value) {
      this.$nextTick(() => {
        if (value == 'yes') {
          console.log(this.$refs.leaders)
        } else if (value == 'no') {
          console.log(this.$refs.opportunities)
        }
      })
    }
  }
};
</script>

内容的提问来源于stack exchange,提问作者user12763413

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:45:34