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

文章目录

  • 🌟 写在前面
  • 🌟 回顾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: stringsonAge: 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: stringsonAge?: number
}>()

🌟 withDefaults方法

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

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

在这里插入图片描述

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


🌟 拓展

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

interface Props {sonName: stringsonAge?: 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.mzph.cn/news/923.shtml

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

相关文章

内网安全:内网穿透详解

目录 内网穿透技术 内网穿透原理 实验环境 内网穿透项目 内网穿透&#xff1a;Ngrok 配置服务端 客户端配置 客户端生成后门&#xff0c;等待目标上线 内网穿透&#xff1a;Frp 客户端服务端建立连接 MSF生成后门&#xff0c;等待上线 内网穿透&#xff1a;Nps 服…

【Linux】- Linux 磁盘分区、挂载

Linux 磁盘分区、挂载 1.1 Linux 分区1.2 硬盘说明1.3 磁盘情况查询 1.1 Linux 分区 原理介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系…

使用 Certbot 并设置自动续期 SSL 证书

使用 Certbot 并设置自动续期 SSL 证书 步骤&#xff1a; 安装 Certbot&#xff1a;使用命令安装 Certbot&#xff1a; sudo yum install certbot获取 SSL 证书&#xff1a;运行 Certbot 命令来获取并安装 SSL 证书。 示例命令&#xff0c;替换其中的域名和路径信息&#xff1…

axios跨域写了withCredentials还是取不到值

axios发送跨域请求&#xff0c;设置请求头为&#xff1a; axios.default.withCredentials true之后&#xff0c;session还是取不到值。 通过后台的输出课间&#xff0c;sessionId不一致。 解决方法&#xff1a; 跨域请求的ip地址&#xff0c;不能写localhost。 比如&#…

Mac搭建安卓模拟器(支持M1/M2)

引言 最近在研究Vue打包成app&#xff0c;给我的报价器搞一个移动端&#xff0c;奈何没有安卓手机用于测试。所以想到安装一个安卓模拟器。 看了下目前主流的安卓模拟器基本都不支持Mac版本。网易的mumu目前来看还是只支持Intel芯。 1. 简单版&#xff08;仅M系&#xff09;…

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…

数据库查询速度上不去的查询和分析

主要原因 数据库查询速度上不去、阻塞是指在并发访问 MySQL 数据库时,某个事务占用了资源并且长时间不释放,导致其他事务无法执行或执行缓慢的情况。MySQL 阻塞可能会导致数据库性能下降,甚至出现死锁等问题,需要马上进行处理。在 MySQL中,线程阻塞可能是由于以下原因导致…

基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统(可修改为coco 80类目标检测)

●项目名称 基于人工智能与边缘计算Aidlux的鸟类检测驱赶系统&#xff08;可修改为coco 80类目标检测&#xff09; ●项目简介 本项目在Aidlux上部署鸟类检测驱赶系统&#xff0c;通过视觉技术检测到有鸟类时&#xff0c;会进行提示。并可在源码上修改coco 80类目标检测索引直…

数据结构专题2

数据结构专题2 - step 1 线段树 1. Cube - HDU 3584 三维的空间中有 n n n 个元素&#xff0c;初始时每个空间元素均为0。更新操作是0变1&#xff0c;1变0&#xff0c;是一个立方体型区域内的所有元素都更新。然后查询是问某个点的元素是0还是1. ( 1 < n < 100 , m…

java 处理mysql获取树形的数据 带级别和子集数量

要求&#xff1a; 获取数据生成树形数据后&#xff0c;要求返回返回层级&#xff08;level&#xff09;和子集(childCount)的个数&#xff0c;便于前端处理。 处理&#xff1a; 1&#xff0c;在遍历的时候&#xff0c;进行处理。 &#xff08;适合内部调用&#xff09; 2&am…

Java日期操作类

Java中的日期操作类提供了丰富的日期和时间操作功能&#xff0c;可以帮助我们方便地处理日期和时间。本篇技术博客将详细介绍Java日期操作类的定义、使用和示例代码。 Java日期操作类 Java中的日期操作类主要有以下几个&#xff1a; java.util.Datejava.util.Calendarjava.t…

ELK-日志服务【logstash-安装与使用】

目录 【1】安装logstash logstash input 插件的作用与使用方式 【2】input --> stdin插件&#xff1a;从标准输入读取数据&#xff0c;从标准输出中输出内容 【3】input -- > file插件&#xff1a;从文件中读取数据 【4】input -- > beat插件&#xff1a;从filebe…

【Vue2.0源码学习】模板编译篇-模板解析阶段(文本解析器)

文章目录 1. 前言2. 结果分析3. 源码分析4. 总结 1. 前言 在上篇文章中我们说了&#xff0c;当HTML解析器解析到文本内容时会调用4个钩子函数中的chars函数来创建文本型的AST节点&#xff0c;并且也说了在chars函数中会根据文本内容是否包含变量再细分为创建含有变量的AST节点…

开发跨平台APP,是用Flutter还是React Native开发框架?

随着移动互联网的飞速发展&#xff0c;对于开发人员而言&#xff0c;如何快速地开发出兼容不同平台&#xff08;iOS、Android&#xff09;的应用&#xff0c;成为了一个重要的问题。 跨平台应用程序开发框架的好处&#xff1a; 1. 一个App适用于多个设备&#xff1b; 2. 一个…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(C语句②)

目录 3.2 最基本的语句——赋值语句 3.2 最基本的语句——赋值语句 在C程序中最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值语句。先介…

arcgis实现影像监督分类

1、打开ArcMap,右击空白处打开影像分类工具栏&#xff0c;如下&#xff1a; 2、打开影像&#xff0c;如下&#xff1a; 打开的影像由于未经处理&#xff0c;颜色看起来很昏暗&#xff0c;这时候可以拉伸一下。具体操作&#xff0c;右击图层选择属性&#xff0c;如下&#xff1a…

基于springboot,vue网上订餐系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术 &#xff1a;VueElementUI 服务端技术&#xff1a;springbootmybatisredis 本系统分用户前台和管理后台两部分&#xff0c;项…

亚马逊评论点赞的作用

在亚马逊上&#xff0c;评论点赞可以起到几个重要的作用&#xff1a; 1、增加可信度&#xff1a;当一个产品或服务有很多积极的评论点赞时&#xff0c;其他用户会更容易相信这些评论的可靠性。点赞数量多的评论通常被认为是由多个用户验证的&#xff0c;并且对于潜在买家来说&…

SpringBoot中注入ServletFilterListener

1.基本介绍 文档&#xff1a;SpringBoot中注入Servlet&Filter&Listener 考虑到实际开发业务非常复杂和兼容问题&#xff0c;SpringBoot支持将Servlet、Filter、Listener注入spring容器中&#xff0c;成为Spring Bean也就是说&#xff0c;SpringBoot开放了和原生WEB组件…

基于单片机智能洗衣机设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;利用STC89C52单片机进行数据处理&#xff1b; 通过2路继电器分别控制洗衣机进水、出水相关逻辑运算&#xff1b;采用L298去掉直流电机实现滚筒正反转&#xff1b;通过单片机进行处理数据&#xff0c;把采集到的数据通过LCD液晶显示…