Vue3 + TypeScript

Vue3 + TS开发环境创建

1. 创建环境

vite除了支持基础阶段的纯TS环境之外,还支持 Vue + TS开发环境的快速创建, 命令如下:

$ npm create vite@latest  vue-ts-pro -- --template vue-ts 

说明:

  1. npm create vite@latest 基于最新版本的vite进行项目创建
  2. vue-ts-pro 项目名称
  3. – --template vue-ts 选择Vue + TS的开发模板

2. 和.vue文件相关的工具

开发阶段

  1. Vue Language Features (Volar)工具对.vue文件进行实时的类型错误反馈
  2. TypeScript Vue Plugin (Volar) 工具用于支持在 TS 中 import *.vue 文件

打包阶段
vue-tsc工具负责打包时最终的类型检查
在这里插入图片描述

好处:开发阶段的类型提示交给IDE做,保证vite的运行速度,打包阶段做’兜底类型校验’,确保类型无误

为Ref标注类型

1. 场景和好处

为ref标注类型之后,既可以在给ref对象的value赋值时校验数据类型,同时在使用value的时候可以获得代码提示
在这里插入图片描述

说明:本质上是给ref对象的value属性添加类型约束

2. 如何标注

ref 函数和 TS 的配合通常分为俩种情况,类型推导和泛型指定类型

  1. 如果是简单的数据,推荐使用类型推导
    在这里插入图片描述

  2. 如果是较复杂的数据,通过泛型指定类型
    在这里插入图片描述

3. 思考题

标注ref函数类型,可以满足把下图所示的数据赋值给value属性
在这里插入图片描述

<script setup lang="ts">
import { ref } from 'vue'type Item = {id: stringname: stringage: number
}
const list = ref<Item[]>([])
list.value = [{ id: '1', name: 'lxx', age: 19 },{ id: '2', name: 'lss', age: 15 }
]
</script><template><div v-for="item in list" :key="item.id">{{ item.name + ' : ' + item.age }}</div>
</template><style scoped></style>

为computed标注类型

1.如何进行类型标注

计算属性通常由已知的响应式数据计算得到,所以依赖的数据类型一旦确定通过自动推导就可以知道计算属性的类型另外根据最佳实践,计算属性多数情况下是只读的,不做修改,所以配合TS一般只做代码提示

const count = ref(0)
const doubleCount = computed(() => count.value * 2)

鼠标放在doubleCount可以得到推导结果

const doubleCount:ComputedRef<number>

2.更复杂的例子

需求:给ref函数标注类型,接收后端返回的对象列表,然后使用计算属性做过滤计算,计算得到单价大于500的商品

<script setup lang="ts">
import { computed, ref } from 'vue'
const data = [{ id: '1001', name: '男鞋', price: 888 },{ id: '1002', name: '女鞋', price: 232 },{ id: '1003', name: '童鞋', price: 333 }
]type Item = {id: stringname: stringprice: number
}const list = ref<Item[]>(data)
const filterList = computed(() => list.value.filter(item => item.price > 500))
</script><template>{{ list }}<hr />{{ filterList }}
</template><style scoped></style>
list的类型为:
const list: Ref<{id: string;name: string;price: number;
}[]>filterList推导出的类型为:
const filterList: ComputedRef<{id: string;name: string;price: number;
}[]>

为事件处理函数标注类型

1. 为什么需要标注类型

原生dom事件处理函数的参数默认会自动标注为any类型,没有任何类型提示,为了获得良好的类型提示,需要手动标注类型
在这里插入图片描述

2. 如何标注类型

  1. 给事件对象形参 e 标注为Event类型,可以获得事件对象的相关类型提示
    在这里插入图片描述

  2. 如果需要更加精确的DOM类型提示可以使用断言(as)进行操作
    在这里插入图片描述

3.思考题

如何给按钮元素button的点击事件函数标注类型?

<script setup lang="ts">
const clickHandler = (e: Event) => {console.log(e.target as HTMLButtonElement)
}
</script><template><button @click="clickHandler">click</button>
</template><style scoped></style>

为模版引用标注类型

1. 为什么需要类型标注

给模版引用标注类型,本质上是给ref对象的value属性添加了类型约束,约定value属性中存放的是特定类型的DOM对象,从而在使用的时候获得相应的代码提示

在这里插入图片描述

2. 如何进行类型标注

通过具体的DOM类型联合null做为泛型参数, 比如我们想获取一个input dom元素
在这里插入图片描述

3. 思考题

尝试为模版引用标注类型获取一个a元素?

<script setup lang="ts">
import { onMounted, ref } from 'vue'
const aRef = ref<HTMLAnchorElement | null>(null)
onMounted(() => {//aRef.value存放的数据在组件渲染完毕之前是null//渲染完毕之后才是真实的dom// 可选链.?console.log(aRef.value?.href)
})
</script><template><a href="#" ref="aRef">xxx</a>
</template><style scoped></style>

对象的非空值处理

1. 空值场景说明

当对象的属性可能是 null 或 undefined 的时候,称之为“空值”,尝试访问空值身上的属性或者方法会发生类型错误
在这里插入图片描述

说明:inputRef变量在组件挂载完毕之前,value属性中存放的值为null,不是input dom对象,通不过类型校验

2. 可选链方案

可选链 ?. 是一种访问嵌套对象属性的安全的方式, 可选链前面的值为 undefined 或者 null时,它会停止运算
在这里插入图片描述

3. 逻辑判断方案

通过逻辑判断,只有有值的时候才继续执行后面的属性访问语句
在这里插入图片描述

4. 非空断言方案

非空断言(!)是指我们开发者明确知道当前的值一定不是null或者undefined,让TS通过类型校验
在这里插入图片描述

特别注意: 使用非空断言要格外小心,它没有实际的JS判断逻辑,只是通过了TS的类型校验,容易直接把空值出现在实际的执行环境里

为组件的Props标注类型

1. 为什么给Props标注类型

给组件的Props标注类型有俩个作用,一个是确保传递的prop是类型安全的,另一个在组件内部使用的时候也会有类型提示
在这里插入图片描述

在这里插入图片描述

2. 基础使用

语法:通过defineProps宏函数对组件props进行类型标注
需求:按钮组件有俩个prop参数,color类型为string且为必填,size类型为string且为可选,怎么定义类型?
在这里插入图片描述

说明:按钮组件传递prop属性的时候必须满足color是必传项且类型为string, size为可选属性,类型为string

3. Props默认值设置

场景:Props中的可选参数通常除了指定类型之外还需要提供默认值,可以使用withDefaults宏函数来进行设置
需求:按钮组件的size属性的默认值设置为 middle
在这里插入图片描述

说明:如果用户传递了size属性,按照传递的数据来,如果没有传递,则size值为 ’middle’

4. 思考题

给按钮组件添加一个btnType属性,类型为 ’success‘, ‘danger’ 或者 ’warning‘ 三选一, 默认值为 ’success‘

<script setup lang="ts">
import MyButton from './components/MyButton.vue'
</script><template><MyButton btn-type="success"></MyButton><MyButton></MyButton>
</template><style scoped></style>

MyButton子组件

<script setup lang="ts">
type Props = {btnType?: 'success' | 'danger' | 'warning'
}const props = withDefaults(defineProps<Props>(), {btnType: 'success'
})console.log(props.btnType)
</script><template></template><style scoped></style>

为组件的emits标注类型

1. 为什么需要标注类型

在这里插入图片描述

作用:可以约束事件名称并给出自动提示,确保不会拼写错误,同时约束传参类型,不会发生参数类型错误

2. 何为组件的emits标注类型

语法:通过 defineEmits 宏函数进行类型标注
需求:子组件触发一个名称为 ’get-msg‘ 的事件,并且传递一个类型为string的参数
在这里插入图片描述

<script setup lang="ts">
import MyButton from './components/MyButton.vue'const getMesageHandler = (e: string) => console.log(e)
</script><template><MyButton @get-msg="getMesageHandler"></MyButton>
</template><style scoped></style>
<script setup lang="ts">
//定义事件类型Emits
type Emits = { // 事件名称		事件参数类型(e: 'get-msg', msg: string): void 
}
//给emits标注类型
const emits = defineEmits<Emits>()
</script><template><!-- 触发自定义事件 --><button @click="emits('get-msg', 'xxx')">按钮</button>
</template><style scoped></style>

3. 思考题

Son组件再触发一个事件’get-list’, 传递参数类型为下图所示的数据类型
在这里插入图片描述

<script setup lang="ts">
import Son from './components/Son.vue'type Item = {id: numbername: string
}
const getListHandler = (e: Item[]) => e.forEach(item => console.log(item.id + ':' + item.name))
</script><template><Son @get-list="getListHandler"></Son>
</template><style scoped></style>
<script setup lang="ts">
type Item = {id: numbername: string
}
type Emits = { (e: 'get-list', msg: Item[]): void }
const emits = defineEmits<Emits>()const clickHandler = () => {const list = [{ id: 1001, name: 'lxx' },{ id: 1002, name: 'kobe' }]emits('get-list', list)
}
</script><template><button @click="clickHandler">按钮</button>
</template><style scoped></style>

类型声明文件

1. 什么是类型声明文件

概念:在TS中以d.ts为后缀的文件就是类型声明文件,主要作用是为js模块提供类型信息支持,从而获得类型提示
在这里插入图片描述

说明:

  1. d.ts是如何生效的?
    在使用js某些模块的时候,TS会自动导入模块对应的d.ts文件,以提供类型提示
  2. d.ts是怎么来的?
    库如果本身是使用TS编写的,在打包的时候经过配置自动生成对应的d.ts文件(axios本身就是TS编写的)

2. 使用 DefinitelyTyped 提供类型声明文件

场景:有些库本身并不是采用TS编写的,无法直接生成配套的d.ts文件,但是也想获得类型提示,此时需要 Definitely Typed 提供类型声明文件
在这里插入图片描述

DefinitelyTyped是一个TS类型定义的仓库,专门为JS编写的库可以提供类型声明,比如可以安装 @types/jquery 为jquery提供类型提示
在这里插入图片描述

3. TS内置类型声明文件

TS为JS运行时可用的所有标准化内置API都提供了声明文件,这些文件既不需要编译生成,也不需要三方提供

在这里插入图片描述

说明:这里的lib.es5.d.ts以及lib.dom.d.ts都是内置的类型声明文件,为原生js和浏览器API提供类型提示

4. 自定义类型声明文件

d.ts文件在项目中是可以进行自定义创建的,通常有俩种作用,第一个是共享TS类型(重要),第二种是给js文件提供类型(了解)

场景一:共享TS类型

在这里插入图片描述

说明:哪个业务组件需要用到类型导入即可,为了区分普通模块,可以加上type关键词

场景二:给JS文件提供类型
在这里插入图片描述

说明:通过declare关键词可以为js文件中的变量声明对应类型,这样js导出的模块在使用的时候也会获得类型提示

5. .ts文件和d.ts文件对比

TS中有俩种文件类型,一种是.ts文件,一种是.d.ts文件
.ts文件

  1. 既可以包含类型信息也可以写逻辑代码
  2. 可以被编译为js文件

.d.ts文件

  1. 只能包含类型信息不可以写逻辑代码
  2. 不会被编译为js文件,仅做类型校验检查

综合案例

完整代码

https://gitee.com/lxxkobe/vue3-ts.git

在这里插入图片描述

频道列表渲染 - 类型思想转变

之前业务开发我们用的是JavaScript,现在要加上TypeScript的类型,该如何把类型加进来呢?
在这里插入图片描述
核心思想:使用TS之后的业务开发思想是保持一致的,重要的是根据接口格式定义响应式数据的类型以及axios返回数据的类型即可

频道列表渲染 - 定义axios的返回数据类型

在这里插入图片描述
image.png
说明: 我们通过泛型参数传给request方法的ChannelRes类型约束了axios返回值res的data属性的类型

文章列表渲染

基础文章列表实现(固定频道id)

  1. 根据接口格式定义数据类型
  2. 使用 ref 函数定义响应式数据
  3. 使用 axios 请求数据并赋值给响应式数据
  4. 数据绑定到模版显示

频道和文章列表联动实现(切换不同的频道id)

  1. 为List组件定义 props 类型
  2. 传递当前频道的 id,使用当前id获取列表

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

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

相关文章

数聚携手永达汽车集团强势入选爱分析《商业智能实践案例》

近日&#xff0c;国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》&#xff0c;此评选活动面向落地商业智能的各行企业和商业智能厂商&#xff0c;以第三方专业视角深入调研&#xff0c;评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

解救Kubernetes混乱:Descheduler快速实现资源平衡

By default, Kubernetes doesn’t recompute and rebalance workloads. You could have a cluster with fewer overutilized nodes and others with a handful of pods How can you fix this? 关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 默认情况下&#xff0c;Ku…

Pyside6 QFileDialog

Pyside6 QFileDialog Pyside6 QFileDialog常用函数getOpenFileNamegetOpenFileNamesgetExistingDirectorygetSaveFileName 程序界面程序主程序 Pyside6 QFileDialog提供了一个允许用户选择文件或目录的对话框。关于QFileDialog的使用可以参考下面的文档 https://doc.qt.io/qtfo…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

从VTI7064与W25Qxx了解SPI通信协议

在学习过程中记录。 学习背景 最近在做的项目需要设计电路包含外扩FLASH&#xff08;W25Q128&#xff09;与SRAM(VTI7064)&#xff0c;二者都用到了SPI通信协议&#xff0c;之前没学过&#xff0c;学习记录一下。 顺便说一下这次学习中发现的好用工具WPS AI。可以对文档进行…

【STM32】时钟设置函数(寄存器版)

一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振&#xff08;HSI&#xff09; 内部晶振不稳定&#xff0c;当我们上电后&#xff0c;会自动产生振动&#xff0c;自动产生时钟&#xff0c;…

【java爬虫】使用selenium获取某交易所公司半年报数据

引言 上市公司的财报数据一般都会进行公开&#xff0c;我们可以在某交易所的官方网站上查看这些数据&#xff0c;由于数据很多&#xff0c;如果只是手动收集的话可能会比较耗时耗力&#xff0c;我们可以采用爬虫的方法进行数据的获取。 本文就介绍采用selenium框架进行公司财…

2023年10月24日程序员节

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

基于Tucker分解的时序知识图谱补全10.23

基于Tucker分解的时序知识图谱补全 摘要引言相关工作静态知识图谱补全时序知识图谱补全 背景提出的模型学习时间复杂度和参数增长表达能力分析 实验 摘要 知识图谱已被证明是众多智能应用的有效工具。然而&#xff0c;大量有价值的知识仍然隐含在知识图谱中。为了丰富现有的知…

[python 刷题] 19 Remove Nth Node From End of List

[python 刷题] 19 Remove Nth Node From End of List 题目&#xff1a; Given the head of a linked list, remove the nth node from the end of the list and return its head. 题目说的是就是移除倒数第 n 个结点&#xff0c;如官方给的案例&#xff1a; 这里提供的 n 就是…

实时配送跟踪功能的实现:外卖跑腿小程序的技术挑战

在当今数字化时代&#xff0c;外卖和跑腿服务已经成为了生活中不可或缺的一部分。为了提供更好的用户体验&#xff0c;外卖跑腿小程序越来越注重实时配送跟踪功能的实现。这项技术挑战旨在确保顾客可以方便地跟踪他们的订单&#xff0c;以及配送员可以高效地完成送货任务。本文…

经典卷积神经网络 - VGG

使用块的网络 - VGG。 使用多个 3 3 3\times 3 33的要比使用少个 5 5 5\times 5 55的效果要好。 VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确…

TDengine小知识-数据文件命名规则

TDengine 时序数据库对数据文件有自己的命名规则&#xff0c;文件名中包含了vnodeID、时间范围、版本、文件类型等多种信息。了解数据文件命名规则&#xff0c;可以让运维工作更简单。 废话不多说&#xff0c;直接上图&#xff1a; v4&#xff1a;文件所属 Vgroup 组&#xf…

leetcode:2347. 最好的扑克手牌(python3解法)

难度&#xff1a;简单 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; "Flush"&#xff1a;同花&#xff0c;五张相同花色的…

安装visual studio报错“无法安装msodbcsql“

在安装visual studio2022时安装完成后提示无法安装msodbcsql, 查看日志文件详细信息提示&#xff1a;指定账户已存在。 未能安装包“msodbcsql,version17.2.30929.1,chipx64,languagezh-CN”。 搜索 URL https://aka.ms/VSSetupErrorReports?qPackageIdmsodbcsql;PackageActi…

用matlab求解线性规划

文章目录 1、用单纯形表求解线性规划绘制单纯形表求解&#xff1a; 2、用matlab求解线性规划——linprog()函数问题&#xff1a;补充代码&#xff1a;显示出完整的影子价格向量 1、用单纯形表求解线性规划 求解线性规划 m i n − 3 x 1 − 4 x 2 x 3 min -3x_1-4x_2x_3 min−…

【ArcGIS模型构建器】04:根据矢量范围批量裁剪影像栅格数据

本文以中国2000-2010-2020年3期GLC30土地覆盖数据为例,演示用模型构建器批量裁剪出四川省3年的数据。 文章目录 一、结果预览二、模型构建三、运行模型四、注意事项一、结果预览 用四川省行政区数据裁剪出的3年Globeland30(配套实验数据data04.rar中有三年中国区域成品数据)…

Java编写图片转base64

图片转成base64 url &#xff0c; 在我们的工作中也会经常用到&#xff0c;比如说导出 word,pdf 等功能&#xff0c;今天我们尝试写一下。 File file new File("");byte[] data null;InputStream in null;ByteArrayOutputStream out null;try{URL url new URL(&…

NAS搭建指南三——私人云盘

一、私人云盘选择 我选择的是可道云进行私人云盘的搭建可道云官网地址可道云下载地址&#xff0c;下载服务器端和 Windows 客户端可道云官方文档 二、环境配置 PHP 与 MySQL 环境安装&#xff1a;XAMPP 官网地址 下载最新的 windows 版本 安装时只勾选 MySQL 与 PHP相关即可…

信号继电器驱动芯片(led驱动芯片)

驱动继电器需要配合BAV99&#xff08;防止反向脉冲&#xff09;使用 具体应用参考开源项目 电阻箱 sbstnh/programmable_precision_resistor: A SCPI programmable precision resistor (github.com) 这个是芯片的输出电流设置 对应到上面的实际开源项目其设置电阻为1.5K&…