在日常开发中,肯定会遇到需要使用ref来获取组件实例的情况:

<template>
  <div class="test">
    <MyDialog ref="MyDialogRef"/>
  </div>
</template>

<script setup lang="ts">
import MyDialog from "./MyDialog.vue";

const MyDialogRef = ref();
</script>

如果只是这样写,我们获取的ref组件实例是一个any类型,如果子组件通过defineExpose对外抛出了接口,显然在父组件中是没法感知到的,为此我们需要一个准确的类型。

利用TypeScript提供的InstanceType类型来准确识别组件类型:

<template>
  <div class="test">
    <MyDialog ref="MyDialogRef"/>
  </div>
</template>

<script setup lang="ts">
import MyDialog from "./MyDialog.vue";

const MyDialogRef = ref<InstanceType<typeof MyDialog | null>>(null);
</script>

此时就可以准确获取到组件类型了。

分类: vue 项目实战 标签: vueref组件类型InstanceType

评论

全部评论 12

  1. ***
    ***
    Google Chrome Windows 10
    应该是这样才对```ref(null)```
    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @***最优解应该还是 ref(),因为ref会自动有一个undefined类型,其实没必要上个null,但是上个null也没有问题,因为书写上更加明确。
  2. 随便看看
    随便看看
    Google Chrome MacOS

    InstanceType并不是vue官方提供的。
    我在使用import type { InstanceType } from "vue";时报错vue没有导出该类型,去官方文档看了发现是ts自带的工具类型,希望博主改下内容

    1. 随便看看
      随便看看
      Google Chrome MacOS
      @随便看看官网的具体说明贴在这了,地址:https://cn.vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs
      1. 木灵鱼儿
        木灵鱼儿
        FireFox Windows 10
        @随便看看感谢指出,我修正一下,我之前倒是这么用的,可能改过了
        1. 随便看看
          随便看看
          Google Chrome MacOS
          @木灵鱼儿好的[支持],顺便请教一下您这网站用的markdown组件是和掘金一样的还是自己写的。如果是库的能否透露下库的名称[保佑]
          1. 木灵鱼儿
            木灵鱼儿
            FireFox Windows 10
            @随便看看这个是typecho博客,php的mvc站点,主题是我自己写的仿掘金主题,你可以在关于页看到github地址
            1. 随便看看
              随便看看
              Google Chrome MacOS
              @木灵鱼儿好的,感谢回复[脱单doge]
  3. Fan
    Fan
    Google Chrome Windows 10
    怎么尖括号打不出来
    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @Fan防止评论里面携带恶意代码,一般都会过滤掉,你可以把括号换一下
  4. Fan
    Fan
    Google Chrome Windows 10
    类型应该为`const MyDialogRef = ref(null)`
  5. Fan
    Fan
    Google Chrome Windows 10

    const MyDialogRef = ref(null)
    应该为
    const MyDialogRef = ref(null)

目录