Vue3中组件使用ref时获取组件类型推导

news/2024/11/16 6:38:26/文章来源:https://www.cnblogs.com/chatlin/p/18297901

本文由 ChatMoney团队出品
我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-Plus UI、Navie UI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例:

<template><div><el-drawer ref="drawerRef" v-model="showDrawer"><el-button type="primary" @click="closeHandle">关闭</el-button></el-drawer></div>
</template><script setup lang="ts">
import { ref } from "vue";
import { ElDrawer } from "element-plus";const drawerRef = ref();
const showDrawer = ref<boolean>(true);const closeHandle = () => {drawerRef.value.handleClose();
};
</script>

这个方法可以正常使用,但是没有任何的ts类型推导,这也就丧失了一部分我们使用ts的初衷。由于我们没有给ref传入任何的泛型,所以drawerRef是any类型,效果如下:

此时,我们想到一个方法,就是尝试给const drawerRef = ref()定义类型,我们第一想到的肯定是将组件传进去不就好了,但其实这样会报错,效果如下:

因为传入的ElDrawer实例本质就是一个组件对象,我们需要传入的是类型,所以我们又会想到使用typeof来获取他的类型不就行了吗,因为在js中,typeof得到的是js中的类型,他是运行时的,但在ts中将typeof写到类型标注的位置的话,得到的是ts的类型,我们来试试看效果怎么样:

此时我们又会看到,类型是有了,但是获取到的是组件配置对象的类型,是通过DefineComponent来得到的,这不是我们想要的类型,我们想要的是通过这个组件配置对象生成的一个组件实例。

接下来重点来了,有一个ts的一个工具叫InstanceType,这个工具可以用来获取一个对象的实例,我们加上去的效果如下:

捕捉到了这个组件暴露出来的handleClose方法,现在终于可以获取到我们想要的类型了。

……但还没完,我们假设每次要使用这个方法,都要写这么一坨东西进去太麻烦了,为了提升便捷程度我们可以将它封装成一个hook,这样我们每次调用他就不需要这么麻烦。

根据刚刚的理解,我们最终得到了以下封装结果:

import { ref } from "vue";/*** 组件类型标注* @param _component 组件实例* @returns 完整类型标注的响应式组件实例*/
export const useComponentRef = <T extends abstract new (...args: any) => any>(_component: T
) => {return ref<InstanceType<T>>();
};

此时,我们只需要将组件传入这个hook就可以得到一个有类型推导的组件实例对象,非常的方便😎。

关于我们
本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742394.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火山引擎数智平台赋能火花思维,A/B测试加速创新

在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车。这一效果的背后,离不开火花思维与火山引擎数智平台的深度合作。通过引入火山引擎的DataFinder和DataTester等产品,火花思维实现了数据问题的快速定位与数据资产的高效利用。更多技术交流、…

node中npm yarn pnpm孰优孰劣???

npm npm2 node版本为4,npm版本就会将为2.x,此时我们执行下那 npm install express分析下node_modules的目录结构。我们会发现, express 包和它的依赖都会被下载下来,展开展开 express,它也有 node_modules:再展开几层,每个依赖都有自己的 node_modules:也就是说 npm2 的…

从0开始搭建博客

1. 概述 本篇博客,我教大家从0开始搭建一个 bolo博客,bolo 博客 和 solo 博客的区别是皮肤更加多,并且可以帐号密码登录。 本篇博客主要的内容如下:linux 安装 docker,设置docker镜像加速 docker 安装 nginx docker 的一些常用的命令 docker 安装 mysql 数据库 docker 安装…

OI 之后的故事 ~After Story~

回归综合 NOI 2023 后,理所当然是回归文化课的学习。 一开始,我惊讶地发现凭借学 OI 期间打下的数学基础及平时阅读英文题面积累的词汇量,我的数学和英语似乎还不错。 最头痛的无疑是语文和物理了。前者属于是玄学,你想到的点答案不一定有;对于后者,计算大题做一道错一道…

CF1936D. Bitwise Paradox-位运算、分治、线段树

link:https://codeforces.com/contest/1936/problem/D 题意:给两个长度为 \(n\) 的序列 \(a\) 和 \(b\),对一个区间 \([l,r]\),称 \([l,r]\) 是好的,若:\((b_l|\dots|b_r)\geq v\)。一个区间的 美丽值 定义为区间内 \(a\) 的最大值。现在有 \(q\) 个操作:1、\(b_i\to x\…

去哪儿故障定位

https://mp.weixin.qq.com/s/9f9PUUy8c-GCJLa0deIvuA

Cilium DSR 特性(转载)

Cilium DSR 特性Cilium DSR(转载) 一、环境信息主机 IPubuntu 10.0.0.234软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0kubernetes 1.23.4ubuntu os Ubuntu 22.04.6 LTSkernel 5.15.0-106 内核升级文档使用 5.11.5 内核版本的 20.04 版本,发起 curl 请求无法代理到 p…

上传恶意代码服务器和数据库的操作

在通过访问端对服务器上传一句话木马的时候,我们需要对服务器进行部分操作: 1.打开服务器远程目录权限: (1)在windows服务器上,将文件夹的只读方式去掉; (2)在linux服务器上,将文件夹的权限改为pwd 2.开启数据库secure_file_priv权限 (1)我这里使用的是mysql5.7.2…

Zabbix 5.0 LTS URL 健康监测

更多细节详情看【zabbix官方文档】 需求 Zabbix 的URL健康监测功能允许你检测 Web 地址是否可用、正常工作以及响应速度。这对于监控网站的可用性和性能非常有用。例如,你可以监控公司网站、API 端点或其他关键服务的 URL。【官方表述 Web monitoring items】【官方表述 Trigg…

idea 修改 git 提交用户名

本项目 修改配置文件 修改当前项目目录下的 config 文件添加以下数据[user]name = **email = **@gmail.com全局修改 git config --global user.name gitlab注册用户名 git config --global user.email gitlab注册邮箱

ChatMoney,你的就业指导明灯

本文由 ChatMoney团队出品介绍说明 Hey!亲爱的小伙伴们,今天我要给大家带来一个职场利器——AI就业指导机器人!🤖 在这个充满变数的职场江湖,找到一份既能养家糊口又能实现自我价值的工作是多么重要。但是,职业道路上的选择和决策并不总是那么容易。有时候,我们需要的不…

AI就业指导机器人,你的专属职业导航灯!

本文由 ChatMoney团队出品介绍说明 Hey!亲爱的小伙伴们,今天我要给大家带来一个职场利器——AI就业指导机器人!🤖 在这个充满变数的职场江湖,找到一份既能养家糊口又能实现自我价值的工作是多么重要。但是,职业道路上的选择和决策并不总是那么容易。有时候,我们需要的不…