使用Vue 3 + TypeScript + Options API的引用

byqmnocz  于 2023-05-23  发布在  Vue.js
关注(0)|答案(2)|浏览(123)

我试图了解将引用与TypeScript和Options API一起使用的最佳方式。在文档中,他们像下面这样引用它,但没有使用TS。当涉及到TS时,他们只解释了如何与Composition API一起使用它。
当我使用this.$refs.myRef时,它抛出这个错误Object is of type 'unknown'.
我知道我可以像这样使用它:(this.$refs.myRef as HTMLElement),但我觉得不应该有必要做的每一个参考每一次。
在Options API + TS中使用引用的正确方法是什么?

a9wyjsp7

a9wyjsp71#

我创建了一个像这样的shim:

shims-runtime-core.d.ts

import * as runtimeCore from '@vue/runtime-core'

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $refs: {
      [key: string]: HTMLElement|any,
    },
    // ... more stuff
  }
}

然后我就能像平常一样接近裁判了。

vxf3dgd4

vxf3dgd42#

我尝试在子组件上使用ref来调用触发器函数,因为使用props和watcher对于这样一个简单的事情来说感觉太复杂了。
添加子组件并在模板中添加ref之后

<ChildComponent ref="childComponent"></ChildComponent>

我只暴露了触发函数:

export default {
    name: "ChildComponent",
    expose: ['someFunction'],  
    methods: {
        someFunction() {
        // …
      },
    },
}

查看更多内容:https://vuejs.org/guide/essentials/template-refs.html#ref-on-component
然后我试着在模板中像这样使用它

<something v-on:click="($refs.childComponent as typeof ChildComponent).someFunction()"></something>

就像这样

this.$refs.childComponent.someFunction();

尽管我从掌掌上得到了这两个错误:供模板中使用
错误TS 18046:“__VLS_ctx.$refs.childComponent”的类型为“未知”
以及在该方法中的使用
错误TS 2571:对象的类型为“未知”
所以我试着像这样在两个地方添加类型信息

($refs.childComponent as typeof ChildComponent)

这在模板中不起作用,您会得到以下错误:
错误TS 2339:类型上不存在属性“ChildComponent”...

<something v-on:click="($refs.childComponent as typeof ChildComponent).someFunction()"></something>

解决方案

但在这种方法中,由于某些原因,它工作得很好

methods: {
  callChildMethod() {
    (this.$refs.childComponent as typeof ChildComponent).someFunction();
  },
}

因此,您需要将触发器函数 Package 在一个方法中,然后在模板中可以调用该函数

<something v-on:click="callChildMethod()"></something>

相关问题