vue+ts 通过 ref 获取子组件实例

本文介绍了在Vue中如何通过`defineExpose`和`InstanceType`实现父子组件之间的通信。首先,使用`defineExpose`暴露子组件内的方法,如`handleClick`,以便外部访问。然后在父组件中,通过引用类型`ref`并指定子组件的API接口或完整实例类型来调用子组件的方法。这种通信方式在单文件组件中尤其有用,确保了组件间的交互安全和可控。
摘要由CSDN通过智能技术生成
  1. 第一种:自定义类型
  • 通过 defineExpose 暴露子组件中的属性或方法
  • 使用 <script setup> 的组件默认是关闭的,无法被其他组件获取该组件内部的各种属性,比如通过 $parentref
  • 如果可以是外部访问到,需要使用 defineExpose 暴露出去想要被外部访问的属性或方法
    • 这里定义了一个方法 handleClick ,并暴露出去
    • 然后定义一个 API 类型,里面是暴露出去的 handleClick
// 子组件
<script setup lang="ts">
	// 然后定义一个 API 类型,里面是暴露出去的 handleClick
	export interface API {
	  handleClick: () => void
	}
	// 这里定义了一个方法 handleClick ,并暴露出去
	defineExpose({
	  handleClick
	})
	let handleClick = (): void => {
	  console.log('触发了.....')
	}
</script>
  • 父组件引入子组件暴露出来的类型,并定义 ref
<template>
	<HelloWorld msg="You did it!" ref="hellworld" />
</template>
<script setup lang="ts">
	// 引入子组件,并导入子组件暴露出来的 API 属性
	import HelloWorld, { type API as childAPI } from './components/HelloWorld.vue'
	import { ref } from 'vue'
	// 定义类型
	const hellworld = ref<null | childAPI>(null)
	const handleClick = () => {
		// 这里可以访问到 handleClick 
	  	hellworld.value?.handleClick()
	}
</script>
  1. 第二种:使用 InstanceType
  • InstanceType<T>ts 自带的类型, 能够直接获取组件完整的实例类型
<script setup lang="ts">'
	import HelloWorld from './components/HelloWorld.vue'
	import { ref } from 'vue'
	
	const hellworld = ref<null | InstanceType<typeof HelloWorld>>(null)
	// 这里可以访问到 handleClick
	const handleClick = () => {
	  hellworld.value?.handleClick()
	}
</script>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值