美文网首页
vue3+ts获取组件Type-safe ref 实例

vue3+ts获取组件Type-safe ref 实例

作者: ci0n | 来源:发表于2021-06-09 09:29 被阅读0次

在 vue3 中获取组件的类型:

type EleForm = InstanceType<typeof ElForm>

在template中获取组件的ref

<template>
  <ElForm ref="$form"></ElForm>
</template>

<script lang="ts">
import { Options, Vue } from 'vue-class-component'
import { ElForm } from 'element-plus'

@Options<Home>({
  components: {
    ElForm,
  },

})
export default class Home extends Vue {

  // 请注意,从 `setup` 返回的 refs 在模板中访问时会自动展开,因此模板中不需要 `.value`
  // https://v3.cn.vuejs.org/api/options-composition.html#setup
  // 所以需要转换 ref 的返回值为 any,修正 $form 的类型
  $form: InstanceType<typeof ElForm> | null = ref<any>(null)
  
  mounted() {
    this.$form?.validate // 类型正确
  }
}
</script>

tsx等render组件中获取的方式更简单

import { defineComponent, ref, onMounted } from '@vue/runtime-core'
import { ElForm } from 'element-plus'


export default defineComponent({

    setup() {
    
        const $form = ref<InstanceType<typeof ElForm>>(null)
        
        onMounted(() => {
            $form?.value?.validate // 类型正确
        })
        
        return () => 
            <ElForm ref={$form}></ElForm>
    }

})

需要注意的是,如果使用expose暴露方法出去,无法获取到对应的类型,您需要自定义类型

// 组件 MyForm
import { defineComponent, ref, onMounted } from '@vue/runtime-core'
import { ElForm } from 'element-plus'

type ELEForm = InstanceType<typeof ElForm>


// 在外界通过 ref 获取组件实例 请使用这个类型
export interface MyFormExpose {
  validate: ELEForm['validate'];
}

export default defineComponent({
    name: 'MyForm',

    setup(props, { expose }) {
    
        const $form = ref<InstanceType<typeof ElForm>>(null)
        
        expose({
          validate: (callback) => $form?.value?.validate(callback),
        } as MyFormExpose)
        
        return () => 
            <ElForm ref={$form}></ElForm>
    }

})
<!-- Home.vue -->
<template>
  <MyForm :ref="$form" />
</template>

<script>
import { defineComponent, ref, onMounted } from '@vue/runtime-core'
import MyForm, { MyFormExpose } from '@/components/MyForm'
export default defineComponent({
  components: { MyForm }
  
  setup(){
    const $form = ref<InstanceType<typeof MyForm> & MyFormExpose>(null)
    
    onMounted(() => {
       $form?.value.validate // 类型正确
    })
  }
})
</script>

相关文章

  • vue3+ts获取组件Type-safe ref 实例

    在 vue3 中获取组件的类型: 在template中获取组件的ref tsx等render组件中获取的方式更简单...

  • React获取DOM

    React获取DOM的方法简述 createRef 当 ref 属性在组件时,获取组件实例;当ref属性在dom时...

  • Vue的ref的使用

    一.什么是ref ? ref用来辅助我们获取DOM元素或组件的引用实例对象,每个vue的组件实例上,都包含一个re...

  • 获取form,ref---antd

    无状态组件,获取form 无状态组件,获取ref 函数组件获取ref

  • Vue 组件

    全局组件引入 局部组件引入 ref获取dom节点、获取组件引用 ref在html元素获取的是dom节点ref在组件...

  • React Refs

    终于看到最后一章了。你可以通过使用 this 来获取当前 React 组件,或使用 ref 来获取组件的引用,实例...

  • react 函数式组件ref的使用

    1、ref的定义React中的ref属性可以帮助我们获取子组件的实例或者Dom对象,进而对组件进行修改场景,点击A...

  • vue关于父组件调用子组件的方法

    我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法 例:子组件: 父组...

  • vue-ref-$refs、$emit、$on使用方式【组件自定

    父组件APP.vue ref相当于id,id获得的是子组件的html框架,ref获得的是组件实例对象 获得组件实例...

  • (十一)template和ref获取元素或组件实例

    这一节将介绍到的是Vue3.x中我们如何通过ref获取元素节点或者组件实例 1、概述:通过ref获取模板元素节点2...

网友评论

      本文标题:vue3+ts获取组件Type-safe ref 实例

      本文链接:https://www.haomeiwen.com/subject/rgnseltx.html