Vue3通透教程【十八】TS为组件的props标注类型

news2025/2/4 8:49:00

文章目录

  • 🌟 写在前面
  • 🌟 回顾defineProps的基础写法
  • 🌟 defineProps的TS写法
  • 🌟 withDefaults方法
  • 🌟 拓展
  • 🌟 写在最后


🌟 写在前面

专栏介绍:
凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其他框架的巨大优势,有兴趣的伙伴可以看一下 Vue框架背后的故事、尤大大对前端生态是这样看的,随着 Vue 框架不断的被认可,现如今的 Vue 框架已经是前端工程师必备的技能了,记得尤大大开发 Vue 的初衷,为了让自己的开发工作更加便捷,也希望这个框架能让更多人的开发工作变得轻松;现如今 Vue 框架做到了,尤大大做到了,当然在 20 年的 9 月 18 日,Vue 又向前端同僚们报告了一次大的突破 Vue3.0 版本正式发布!如今已经过去了两年多的时间,更多的公司选择了Vue3技术,所以凉哥也在这个时候为大家出这份专栏,本专栏将帮助大家掌握Vue3+TS技术,提升自己竞争力!

温故知新:
上篇文章带领大家一起搭建了我们的第一个Vue3+TS的项目,本篇的内容我们就来用TS来编写我们前面Vue3+JS的功能代码;让大家初步了解感受TS的结合运用!让我们 let’s coding!

我们也遵循官方推荐的渐进规则,我们首先来改造的的就是我们Vue3的父子组件通讯写法,如果你还不了解Vue3中的父子组件通讯,可以先看下咱们Vue3通透教程【九】父子组件通讯一目了然 这篇文章;后面的编码中我们就用上篇文章中创建的demo项目即可!


🌟 回顾defineProps的基础写法

不知道大家一眼看到defineProps还是否能够get到这是做什么的?其实就是前面为大家讲解的父组件向自组件传递数据,我们首先就来以这个方法为例子来将它用TS的写法呈现出来;这里呢我们还是初始化一个案例!子组件中我们接受两个参数一个是姓名,一个年龄,然后父组件传递这两个参数;

在这里插入图片描述

在项目中src/components目录下我们创建一个son.vue作为子组件,接受姓名、年龄作为参数;

<template>
    <div>姓名:{{ sonName }}</div>
    <div>年龄:{{ sonAge }}</div>
</template>
<script setup>
defineProps({
    sonName: {
        type: String,
        default: '',
        required:true,
    },
    sonAge: {
        type: Number,
        default: ''
        required:true,
    }
})
</script>

删除app.vue中的代码,我们将此作为父组件!引入代码子组件并通过自定义属性进行传参。

<template>
  <p>儿子信息:</p>
  <son sonName="哈哈" :sonAge="18"></son>
</template>
<script setup>
import son from "./components/son.vue";
</script>

在这里插入图片描述

打开页面我们能够看到可以正常显示,但是细心的伙伴会发现一个问题,为什么在demo这个项目我们的<script setup>这句代码会有波浪线的提示;

在这里插入图片描述

其实这里的提示呢很好理解就是我们创建的这个项目呢是Vue3+TS的项目,但是我们这里的代码就是缺少了lang="ts"所以代码检测会给我们波浪线的提示当然他不会报错也不影响执行;我们添加上就好了;就是把<script setup>换成<script setup lang="ts">但是我们这样替换后,下面的代码也会又了波浪线提示,这个就是我们TS语法上提示了,我们也就开始要把我们刚才的写法,替换成TS写法;


🌟 defineProps的TS写法

我们还是来到son.vue文件中,然后我们为defineProps方法上加上泛型;为两个字段添加上类型;

<template>
    <div>姓名:{{ sonName }}</div>
    <div>年龄:{{ sonAge }}</div>
</template>
<script setup lang="ts">
// defineProps({
//     sonName: {
//         type: String,
//         default: '',
//         required: true,
//     },
//     sonAge: {
//         type: Number,
//         default: '',
//         required: true,
//     }
// })
defineProps<{
    sonName: string
    sonAge: number
}>()
</script>

是不是很简单,哈哈,这里也给大家扩展一下,就是我们现在呢两个参数都是必填,而且都没有配置默认值,如果说我们把年龄配置为非必填,默认值为1,这个的话我们用原来的基础写法就很简单,如下配置即可;我们把app.vue中对自组件传递的sonAge参数删除,就会使用我们默认的1;

defineProps({
    sonName: {
        type: String,
        default: '',
        required: true,
    },
    sonAge: {
        type: Number,
        default: 1,
        required: false,
    }
})

在这里插入图片描述

那我们在Vue3+TS中如何去实现非必填且有默认值呢?下面我们先来看下非必填,这个很简单,就是添加一个?即可;

defineProps<{
    sonName: string
    sonAge?: number
}>()

🌟 withDefaults方法

刚才我们在上面实现了TS写法的非必填,那么默认值该如何配置呢?其实就用到Vue中提供的这个方法withDefaults,这个方法接收两个参数,一个就是我们上面的defineProps整个方法,第二个参数就是我们需要配置的默认值,我们来编写一个代码;

withDefaults(
    defineProps<{
        sonName: string
        sonAge?: number
    }>(), {
    sonAge: 2
}
)

在这里插入图片描述

这将被编译为等效的运行时 props default 选项。此外,withDefaults 帮助程序为默认值提供类型检查,并确保返回的 props 类型删除了已声明默认值的属性的可选标志。


🌟 拓展

上面我们在为props标注类型的时候还算清晰,但是到了使用withDefaults方法嵌套的时候,会感觉有点乱,所以我们可以将类型的生命力提到一个接口中;

interface Props {
    sonName: string
    sonAge?: number
}

withDefaults(
    defineProps<Props>(), {
    sonAge: 3
}
)

这样是不是就会清晰很多呢!


🌟 写在最后

大家看完这篇文章,相信大家对我们Vue3与TS的结合有了初步的了解,可能我们用惯了js,初步使用TS会有一些别扭,确实是这样的,我在最初使用的时候亦是如此,但是我们还是要慢慢的去掌握他,熟练他,毕竟趋势很明显,众多框架向他拥护,我们一起加油!下篇文章中我们会为大家呈现更多组合API的TS写法!各位小伙伴让我们 let’s coding!

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

解决 Error:java: Compilation failed: internal java compiler error

编译失败 因为maven工程项目的 多个model 模块的jdk版本不同 改成一样的就可以了

mysql进阶 —— 主从复制和读写分离

前言 在这篇文章中荔枝会梳理MySQL中有关主从复制和读写分离的相关知识点&#xff0c;主要包括基本的概念、配置搭建、命令和模式选择等几个方面。MySQL主从复制和读写分离属于MySQL数据库学习中的高阶内容了&#xff0c;大家要和荔枝一起加油学习噢~~~希望能帮助到需要的小伙伴…

【机密计算标准】GB/T 41388-2022 可信执行环境基础安全规范

1 范围 本文件确立了可信执行环境系统整体技术架构&#xff0c;描述了可信执行环境基础要求、可信虚拟化系统、可信操作系统、可信应用与服务管理、跨平台应用中间件等主要内容及其测试评价方法。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用面构成本文件必不…

MFC 基于数据库的管理系统

文章目录 初始化设置菜单 添加数据库类创建数据库配置数据库 全部代码 初始化 创建文件选择基于CListView 初始化数据 public:CListCtrl& m_list;CSQLView::CSQLView() noexcept:m_list(GetListCtrl()) {// TODO: 在此处添加构造代码}void CSQLView::OnInitialUpdate() {C…

RK3588 CPU GPU NPU 定频和性能模式设置方法以及温度监控

一. CPU定频 1. RK3588的cpu是4个A554个A76&#xff0c;分为3组单独管理&#xff0c;节点分别是&#xff1a; /sys/devices/system/cpu/cpufreq/policy0&#xff08;对应四个A55:CPU0-CPU3&#xff09; /sys/devices/system/cpu/cpufreq/policy4&#xff08;对应2个A76:CPU4-…

【Java从0到1学习】01 Java 概述

1. Java概述 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Java…

微信小程序基于Promise封装发起网络请求

1.创建一个request.js // 相当于域名 const baseURL ***************; // 暴露一个request函数 export function request(parms) {// 路径拼接const url baseURL parms.url;// 请求体&#xff0c;默认为{}const data parms.data || {};// 请求方式&#xff0c;默认为GETco…

<Babel> 前端语言的巴别塔

Babel中文站点&#xff1a;https://www.babeljs.cn/ Babel外文站点&#xff1a;https://babeljs.io/ 什么是Babel Babel取自人类语言最早的传说&#xff0c;Tower of Babel。 上帝摧毁了巴别塔上说着共同语言的我们&#xff0c;又被Babel重新带了回来。 如果说巴别塔是人们对混…

windows命令行运行mysql

1.运行命令&#xff1a;mysql -u用户名 -p密码 2.创建数据库&#xff1a; create 数据库名称 &#xff1b; 3.use 数据库 4.show tables &#xff1b; 5.创建用户&#xff0c;分配权限 6.退出 ctrlc 7.切换用户

海外app在谷歌和苹果商店中该如何设置关键词

主导应用商店搜索结果的方法就是关键词的设置。我们需要寻找关键词&#xff0c;跟踪关键词排名并监控其应用的性能&#xff0c;这样就能大大的提高应用的可见度。 优先考虑可推动Android或ios应用自然下载量的关键词&#xff0c;使用搜索量指标了解某个关键词在应用商店中的搜…

数字孪生很火嘛?是做什么的?

数字孪生是一种新兴的技术概念&#xff0c;将现实世界与数字世界紧密结合&#xff0c;通过数字化的方式模拟、仿真和预测真实世界的物理实体、过程和系统。它是物理实体与其数字化的虚拟模型之间的一种互联关系&#xff0c;旨在实现对现实世界的全面感知和实时监测。 数字孪生的…

骑行健身,生活和工作压力的避风港

在忙碌的现代生活中&#xff0c;每个人都面临着种种生活压力和工作压力。而自行车运动&#xff0c;正是一种理想的压力释放方式。它不仅能帮助我们保持身体健康&#xff0c;更能丰富我们的生活&#xff0c;让我们在自然中寻找宁静。 首先&#xff0c;骑自行车是一种全身性的运动…

BigTable:一个针对结构化数据的分布式存储系统----论文摘要

目录 摘要 1. 介绍 2. 数据模型 行 列族 时间戳 3. API 4. 所需构件 5. 实现 5.1 Tablet的位置 5.2 Tablet分配 5.3 Tablet服务 5.4 压实&#xff08;Compactions&#xff09; 6. 优化 本地化分组 压缩(compression) 通过缓存提高读操作的性能 Bloom过滤器 C…

2023年7月16日,HashMap

HashMap HashMap存储的是一组无序的键值对。存储时是根据键的哈希码来计算存储的位置&#xff0c;因为对象的哈希码是不确定的&#xff0c;因此HashMap存储的元素是无序的。 Map用于保存具有映射关系的数据&#xff0c;Map里保存着两组数据&#xff1a;key和value&#xff0c;它…

Leetcode-每日一题【2487.从链表中移除节点】

题目 给你一个链表的头节点 head 。 对于列表中的每个节点 node &#xff0c;如果其右侧存在一个具有 严格更大 值的节点&#xff0c;则移除 node 。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8]输出&#xff1a;[13,8]解释&…

拒绝被其他域名恶意解析到你的服务器上

拒绝被其他域名恶意解析到你的服务器上 备案问题恶意解析解决方案后记 备案问题 新的一周开始了&#xff0c;又是一个摸鱼的好时候。。。。结果&#xff0c;刚刚坐到工位上&#xff0c;机房客服发来了一个 excel &#xff0c;说。。。你的备案信息没完善。。。 啥&#xff1f…

C语言进阶之程序环境和预处理

程序环境和预处理 1. 程序的翻译环境和执行环境2. 详解编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 3. 预处理详解3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##3.2.5 带副作用的宏参数3.2.6 宏和函数对比…

快速搭建接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff…

Python基础教程:数据结构

Python是一门广泛使用的编程语言&#xff0c;它的丰富的数据结构使得编写程序变得异常简单和方便。在本篇教程中&#xff0c;我将详细介绍Python中的四种主要数据结构&#xff1a;列表、元组、字典、集合。 1.列表&#xff08;List&#xff09; 列表是Python中最常用的数据结…

Nginx代理Grafana,鉴权访问以及Grafan免登录访问

✨概述 在使用grafana做页面嵌入的场景中&#xff0c;通常需要grafana与前端在同域下&#xff0c;方便鉴权、解决跨域。 Nginx代理Grafana后&#xff0c;就不能使用Grafana中默认配置的端口和路径进行访问&#xff0c;必须通过Nginx访问Grafana。 如果需要做Iframe嵌入自研系…