如何在 Vue3 组件中使用 TS 类型(必看)

news2024/11/18 3:30:03

一、为 props 标注类型

使用 <script setup>

方式一:当使用 <script setup> 时,defineProps() 宏函数支持从它的参数中推导类型:

const props = defineProps({
      treeTableProps: {
            type: Array,
            default: null,
            required: false
      },
      msg: {
            type: String,
            required: false
      }

})
// 使用
console.log(props.msg)

方式二:通过泛型参数来定义 props 的类型,这种方式更加直接

interface T {
      prop: string,
      label: string,
      width: number,
      children: Array<T>
}
const props = defineProps<{
      msg?: string,
      treeTableProps: Array<T>,
}>()

或者通过ts的接口interface简写一下:

// 方式三
interface T {
      prop: string,
      label: string,
      width: number,
      children: Array<T>
}

interface params {
      msg?: string,
      treeTableProps: Array<T>,
}
const props2 = defineProps<params>()

这被称为 基于类型的声明 ,编译器会尽可能地尝试根据类型参数推导出等价的运行时选项。这种方式的不足之处在于,失去了定义 props 默认值的能力。

为了可以给参数设置默认值,我们可以使用 withDefaults 编译器宏:

interface T {
      prop: string,
      label: string,
      width: number,
      children?: Array<T>
}
interface params {
      msg?: string,
      treeTableProps: Array<T>,
}
const props = withDefaults(defineProps<{
      msg?: string,
      treeTableProps: Array<T>,
}>(), {
      msg: '我是默认值',
})
//or
const props = withDefaults(defineProps<params>(), {
      msg: '我是默认值',
})

二、为 emits 标注类型 

在 <script setup> 中,emit 函数的类型标注也可以使用 运行时声明 或者 基于类型的声明 :

//子组件
const emit = defineEmits(['receiveData'])

function cellClick(row: any) {
      emit('receiveData', row)
}
//父组件
<Index @receiveData="receiveData" :treeTableProps="treeTableProps"></Index>

//接收数据
let childData = ref<any>()
function receiveData(row: object) {
      childData.value = row
}

三、为 ref() 标注类型

默认推导类型

ref 会根据初始化时的值自动推导其类型:

// 推导出的类型:Ref<number>
const year = ref(2020)

// => TS Error: Type 'string' is not assignable to type 'number'.
year.value = '2020'

通过接口指定类型

有时我们可能想为 ref 内的值指定一个更复杂的类型,可以通过使用 Ref 这个接口:

import type { Ref } from 'vue'
import { ref } from 'vue'
// 通过Ref接口指定类型
const year: Ref<string | number> = ref('2023')
year.value = 2023//成功

通过泛型指定类型

或者,在调用 ref() 时传入一个泛型参数,来覆盖默认的推导行为: 

// 得到的类型:Ref<string | number>
const year = ref<string | number>('2020')

year.value = 2020 // 成功!
如果你指定了一个泛型参数但没有给出初始值,那么最后得到的就将是一个包含 undefined 的联合类型:

// 推导得到的类型:Ref<number | undefined>
const n = ref<number>()

四、为 reactive() 标注类型

默认推导类型 

// 默认推导 推导得到的类型:{ str: string }
const str = reactive({ str: '122' })

通过接口指定类型

// 通过接口指定类型
interface obj {
      name: string,
      age: number
}
const myObj: obj = reactive({ name: 'suosuo', age: 20 })

五、为 computed() 标注类型

默认推导类型

computed() 会自动从其计算函数的返回值上推导出类型:

import { ref, reactive, computed } from 'vue'
const count = ref(0)
// 推导得到的类型:ComputedRef<number>
const value = computed(() => count.value * 2)

通过泛型指定类型

你还可以通过泛型参数显式指定类型:

const value = computed<number>(() =>
      count.value * 2 // 若返回值不是number类型就会报错
)

六、为事件处理函数标注类型

<template>
  <input type="text" @change="handleChange" />
</template>

// 为事件处理函数标注类型
function handleChange(event: Event) {
      console.log((event.target as HTMLInputElement).value)
}

没有类型标注时,这个 event 参数会隐式地标注为 any 类型。就会有提示,因此,建议显式地为事件处理函数的参数标注类型。如上面代码所示

 七、为组件模板引用标注类型

假设存在一个模态框,通过在父组件触发该组件的open函数来显示该页面的内容。

注意:当我们想要从父组件中调用子组件方法时,需要将该方法在子组件中通过defineExpose暴露出来,否则无法调用。

<template>
      <div class='main'>
            <h2 v-if="isShowModal">我的模态框的内容</h2>
      </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'
const isShowModal = ref(false)
const open = () => (isShowModal.value = true)
defineExpose({
      open,
});
</script>

此时我们需要为一个子组件添加一个模板 ref,以便调用它公开的方法。(vue2中我们是通过给子组件设置ref属性,然后通过this.$refs.xxx.methods()来实现的),那这里如何实现呢?

为了获取 Modal 的类型,我们首先需要通过 typeof 得到其类型,再使用 TypeScript 内置的 InstanceType 工具类型来获取其实例类型:

父组件:

<template>
      <button @click="showModal">显示模态框</button>
      <Modal ref="modalRef"></Modal>
</template>

<script lang="ts" setup>
import { getCurrentInstance, onMounted, ref } from 'vue'
import Modal from '@/components/modal.vue'

const modalRef = ref<InstanceType<typeof Modal> | null>(null)
const showModal = () => {
      modalRef.value?.open()
}
</script>

注意:子组件的ref值应该和下面定义的值保持一致,如:modalRef 

看点击按钮之后的效果: 

如何在 vue3 组件中使用 TS 类型的讲解就到此结束啦,有写的不对的地方,欢迎评论区指出哦~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 JavaScript 实现【玩牌高手】【2023 B卷 100分】,附详细解题思路

一、题目描述 给定一个长度为n的整型数组&#xff0c;表示一个选手在n轮内可选择的牌面分数。 选手基于规则选牌。 请计算所有轮结束后其可以获得的最高总分数。 选择规则如下&#xff1a; 在每轮里选手可以选择获取该轮牌面&#xff0c;则其总分数加上该轮牌面分数&#…

✎Qt-doc——尺寸调整策略(QSizePolicy)

目录 QSizePolicy类详述成员类型文档 QSizePolicy类详述 小部件的尺寸策略是其愿意以各种方式调整大小的表达方式&#xff0c;并影响布局引擎对小部件的处理方式。每个小部件返回一个描述其在布局时首选的水平和垂直调整策略的QSizePolicy。您可以通过更改其QWidget::sizePoli…

SpringCloud:分布式事务Seata事务模式

Seata会有 4 种分布式事务解决方案&#xff0c;分别是AT模式、TCC模式、Saga模式和XA模式。 1.AT 模式 2019 年 1 月份&#xff0c;Seata开源了AT模式。AT模式是一种无侵入的分布式事务解决方案。在AT模式下&#xff0c;用户只需关注自己的业务SQL&#xff0c;用户的 业务SQL …

2023-06-16 Android app 使用opencv 调用jni在图片上添加文字,对图片进行模糊处理,源码实例学习。

一、要理解还是得自己看代码 1.1 完整的测试代码路径如下 https://download.csdn.net/download/qq_37858386/87916944 1.2 代码架构 1.3 app 运行效果 二、android studio 添加 opencv module可以参考下面的文章&#xff0c;比较详细。 Android OpenCV 入门教程笔记&#x…

华为OD机试真题 JavaScript 实现【计算最大乘积】【2022Q4 100分】,附详细解题思路

一、题目描述 给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值&#xff0c; 如果没有符合条件的两个元素&#xff0c;返回0。 二、输入描述 输入为一个半角逗号分隔的小写字符串的数组&#xff0c;2 < 数组长度<100&am…

Linux之RPM管理工具

目录 Linux之RPM管理工具 定义 作用 RPM软件包 RPM软件包的经典命名格式 RPM安装 语法格式 参数及作用 有关rpm包相关网站 RPM查询功能 语法格式 参数及作用 案例 rpm软件包安装 软件包升级 rpm软件包卸载 rpm卸载 强制卸载 rpm包签名验证 用途 查看签名 …

程序员如何转型成为个人开发者

作者&#xff1a;哈桑c&#xff08;CSDN平台&#xff09; 文章目录 1、什么是个人开发者&#xff1f;2、个人开发者如何赚钱&#xff1f;3、程序员如何转型成为个人开发者&#xff1f;4、成为个人开发者需要学习哪些技能&#xff1f;结语 1、什么是个人开发者&#xff1f; 个人…

redhat安装oracle11g单实例软件建库

1、打开xmanager-passive 2、oracle 用户登录&#xff0c;开始安装 [rootrhel64 database]# su - oracle [oraclerhel64 ~]$ evn |grep oracle -bash: evn: command not found [oraclerhel64 ~]$ evn | grep oracle -bash: evn: command not found [oraclerhel64 ~]$ env | g…

首次使用云服务器搭建网站(三)

上回说到&#xff0c;我们已经搞定了服务器问题和网站模板问题&#xff0c;接下来只需要上传模板即可。 一、上传网站代码 1、打开宝塔面板&#xff0c; 点开文件、这里就是我们服务器的所有文件了。 2、依次点击WWW文件夹、wwwroot文件夹、域名文件夹&#xff0c;进入…

Python之私有属性、私有方法、装饰器及属性和类的命名规则

一、私有属性和私有方法(实现封装) Python对于类的成员没有严格的访问控制限制&#xff0c;这与其他面向对象语言有区别。关于私有属性和私有方法&#xff0c;有如下要点&#xff1a; 通常我们约定&#xff0c;两个下划线开头的属性是私有的(private)。其他为公共的(public)。…

Centos环境 使用docker 部署MySQL 8.X详细版本

文章目录 安装docker配置docker 阿里镜像加速阿里云容器镜像服务ACR配置镜像源 安装部署MySQL拉取MySQL镜像创建挂载文件测试部署部署MySQL进入容器将它的mysql配置同步给宿主机删除test1测试容器 正式部署MySQL查看正式部署的容器状态配置远程连接字符集以及关闭跳过密码验证等…

Aop详解

AOP简介 AOP是一种编程思想&#xff0c;就如同面向对象这种编程思想一样&#xff0c;是一种编程范式&#xff0c;用来指导开发者如何组织程序更好的运行 AOP&#xff08;面向切面编程&#xff09; 作用&#xff1a;在不改变原代码的前提下&#xff0c;为其增加功能。 连接点…

基于 Yeoman 脚手架技术构建前端项目的实践

NodeJ、CLI 基于 Yeoman 脚手架技术构建前端项目的实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details…

torch.optim.lr_scheduler.OneCycleLR 学习与理解

一、功能和参数 1.1、通过图像直观地理解 OneCycleLR 的过程&#xff1a; 补充&#xff1a; 生成该图像的代码&#xff1a; 来自&#xff1a;torch.optim.lr_scheduler.OneCycleLR用法_dxz_tust的博客-CSDN博客 import cv2 import torch.nn as nn import torch from torchv…

Nodejs二、内置模块

零、文章目录 Nodejs二、内置模块 1、fs 文件系统模块 &#xff08;1&#xff09;fs 文件系统模块是什么 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求。 fs.readFile() &#xff1a;用来读取指…

【深度学习-第2篇】CNN卷积神经网络30分钟入门!足够通俗易懂了吧(图解)

网络上有着很多关于CNN入门的教程&#xff0c;但是总还是觉得缺少足够简易、直观、全面的文章&#xff0c;能让人通读下来酣畅淋漓&#xff0c;将CNN概念尽收囊中。本篇文章就想尝试一下&#xff0c;真正地带小白同学们轻松入门。 这篇文章包含很多图片&#xff0c;为了花这些…

k8s-containerd容器运行时默认50G存储位置更换

containerd作为k8s主要的cri&#xff0c;它默认存储位置是使用的/根目录挂载的资源。当容器运行的越来越多&#xff0c;默认的50G不够使用了。有2种方法可以进行解决。 方式1、增加/根分区的磁盘空间。 方式2、修改containerd配置文件&#xff0c;修改默认配置为/home 这里我…

【汤4操作系统】深入理解信号量的使用-三大问题的变体

主要从生产者消费者、读写者、哲学家问题中的经典变体进行讲述&#xff0c;均使用伪代码实现 生产者消费者变体 顾客看作是生产出的产品&#xff0c;理发师看作是消费者&#xff0c;沙发有空位&#xff0c;顾客就进去&#xff0c;沙发有顾客&#xff0c;理发师就去理发 和生产者…

Redis客户端 - Jdies快速入门

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis客户端 - Jdies快速入门 | CoderMast编程桅杆Redis客户端 - Jdies快速入门 简介 Jedis is a Java client for Redis designed for performance and ease of use. Jedis是Redis 的 Java 客户端&#xff0c;专为性能和易…

Python中使用matplotlib绘制各类图表示例

折线图 折线图是一种用于表示数据随时间、变量或其他连续性变化的趋势的图表。通过在横轴上放置时间或如此类似的连续变量&#xff0c;可以在纵轴上放置数据点的值&#xff0c;从而捕捉到数据随时间发生的变化。折线图可以用于比较不同变量的趋势&#xff0c;轻松地发现不同的…