Vue3 ts环境下的PropType

news2025/1/15 16:29:48

 简介

      在Typscript中,我们可以使用PropType进行类型的推断与验证。在日常的开发中我们常常会遇到下面这样的场景:

        我们通过request请求从服务端获取了一条数据,数据是个Array的格式,Array中的每个元素又是一个对象,像下面这样的数据

const intro = [
  {
    title: "标题一",
    description: "描述一",
    totalNum: 1
  },
  {
    title: "标题二",
    description: "描述二",
    totalNum: 2
  },
  {
    title: "标题三",
    description: "描述三",
    totalNum: 3
  },
]

        此时我们如果封装几个方法在ts文件中,用于处理这样的服务端数据,在传参的过程中,我们可能用一个Array类型去接这个intro数组,但可能项目多人开发,别人在使用这个数组时就不了解这个Array中具体每个元素是什么类型,此时我们使用PropType。

使用

        一个小栗子,在非setup语法糖的环境中使用PropType

export interface CompProps {
  title: string;
  description: string;
  totalNum: number;
}
<template>
  <div class="backbox">
    <div class="introbox">
      <div v-for="item in intro">
        <div class="intro">title = {{ item.title }}</div>
        <div class="intro">description = {{ item.description }}</div>
        <div class="intro">totalNum = {{ item.totalNum }}</div>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
import { PropType, defineComponent } from "vue";
import { CompProps } from './prop';

export default defineComponent({
  name: "Comp",
  props: {
    intro: {
      type: Array as PropType<CompProps[]>,
      required: true
    },
  }
})
</script>
<style lang="less" scoped>
.introbox {
  background-color: antiquewhite;
  padding: 20px;
  .intro {
    display: inline-block;
    padding: 20px;
    margin: 10px;
    background-color: silver;
  }
}
</style>
<template>
  <div>
    <h2>PropType属性的类型验证</h2>
    <div>
      <Comp :intro="intro"></Comp>
    </div>
  </div>
</template>
<script setup lang="ts">
import Comp from './component/index.vue';

const intro = [
  {
    title: "标题一",
    description: "描述一",
    totalNum: 1
  },
  {
    title: "标题二",
    description: "描述二",
    totalNum: 2
  },
  {
    title: "标题三",
    description: "描述三",
    totalNum: 3
  },
]
</script>
<style></style>

        当我们在上边这段代码的文件中,使用鼠标停在Comp元素上时,此时vscode给出的提示是下面这张图里的样子 :

        可以看到intro不是个Array类型,而是PropType<CompProps[]>类型。 

一个小栗子,在setup语法糖中使用PropType

export interface CompNum {
  num: number;
  id: number;
}
<template>
  <div class="backbox">
    <div class="btnbox" v-for="num in numbs">
      <div class="btn" :id="String(num.id)" @click="buttonEvent($event)">{{ num.num }}</div>
    </div>
  </div>
</template>
<script setup lang="ts">
import { PropType, ref } from 'vue';
import { CompNum } from './prop';

const props = defineProps({
  nums: {
    type: Array as PropType<CompNum[]>,
    default: []
  }
});
const emits = defineEmits(['update:nums']);
const numbs = ref(props.nums);
const buttonEvent = (event: any) => {
  let index = event.target.id;
  let arr = numbs.value;
  arr[index].num++;
  numbs.value = arr;
  emits('update:nums', numbs);
}
</script>
<style scoped lang="less">
.btnbox {
  display: flex;
  flex-direction: row;
  background-color: cadetblue;
}
.btn{
  display: inline-block;
  padding: 25px 40px 25px 40px;
  margin: 10px 40px 10px 20px;
  background-color: aquamarine;
  text-align: center;
}

</style>
<template>
  <div>
    <h2>PropType属性的类型验证</h2>
    <div>
      <Btns v-model:nums="numsRef"></Btns>
    </div>
  </div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
import Btns from './component/button.vue';

const intro = [
  {
    title: "标题一",
    description: "描述一",
    totalNum: 1
  },
  {
    title: "标题二",
    description: "描述二",
    totalNum: 2
  },
  {
    title: "标题三",
    description: "描述三",
    totalNum: 3
  },
]
let one = { num: intro[0].totalNum, id: 0 };
let two = { num: intro[1].totalNum, id: 1 };
let three = { num: intro[2].totalNum, id: 2};
const nums = [one, two, three];
const numsRef = ref(nums);

watch(() => numsRef.value,
 (value) => {
  console.log("newValue = ", value);
  },
  {deep: true}
);

</script>
<style></style>

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

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

相关文章

BFS宽度优先搜索例题(蓝桥杯)——逃跑的牛

问题描述&#xff1a; 农夫John的一头牛逃跑了&#xff0c;他想要将逃跑的牛找回来。现假设农夫John和牛的位置都在一条直线上&#xff0c;农夫John的初始位置为N&#xff08;0≤N≤100,000&#xff09;&#xff0c;牛的初始位置为K&#xff08;0≤K≤100,000&#xff09;。农夫…

MySOL之旅--------MySQL数据库基础( 3 )

本篇碎碎念:要相信啊,胜利就在前方,要是因为一点小事就停滞不前,可能你也不适合获取胜利,成功的路上会伴有泥石,但是走到最后,你会发现身上的泥泞皆是荣耀的勋章! 今日份励志文案: 凡是发生皆有利于我 目录 查询(select) 1.全列查询 2.指定列查询 3.查询字段为表达式 ​编…

数据库被rmallox勒索病毒加密,如何还原?

近年来&#xff0c;网络安全问题日益严峻&#xff0c;勒索病毒作为其中的一种恶意软件&#xff0c;已成为网络安全领域的一大难题。其中&#xff0c;rmallox勒索病毒以其高度的隐蔽性和破坏性&#xff0c;给不少企业和个人带来了严重损失。本文将从rmallox勒索病毒的特点、传播…

【2024年MathorCup数模竞赛】C题赛题与解题思路

2024年MathorCup数模竞赛C题 题目 物流网络分拣中心货量预测及人员排班背景求解问题 解题思路问题一问题二问题三问题四 本次竞赛的C题是对物流网络分拣中心的货量预测及人员排班问题进行规划。整个问题可以分为两个部分&#xff0c;一是对时间序列进行预测&#xff0c;二是对人…

C++初阶:模板进阶

非类型模板参数 模板参数分为类型形参与非类型形参 。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称 。 非类型形参&#xff0c;就是用一个常量作为类 ( 函数 ) 模板的一个参数&#xff0c;在类 ( 函数 ) 模板中可将…

7、configMap

1、configMap是什么 类似与pod的配置中心&#xff0c;不会因为pod的创建销毁&#xff0c;相关配置发生改变 pod定义硬编码意味着需要有效区分⽣产环境与开发过程中的pod 定义。为了能在多个环境下复⽤pod的定义&#xff0c;需要将配置从pod定义描 述中解耦出来。 2、向容器中…

HarmonyOS实战开发-证书管理、如何实现对签名数据进行校验功能。

介绍 本示例使用了ohos.security.certManager相关接口实现了对签名数据进行校验的功能。 实现场景如下&#xff1a; 1&#xff09;使用正确的原始数据和签名数据进行签名校验场景&#xff1a;模拟服务端对签名数据进行校验&#xff0c;验证客户端身份和原始数据完整性。 2&…

智慧污水井物联网远程监控案例

智慧污水井物联网远程监控案例 在当今数字化转型的浪潮中&#xff0c;智慧水务已成为城市基础设施建设的重要组成部分。其中&#xff0c;基于物联网技术的智慧污水井远程监控系统以其高效、精准、实时的特性&#xff0c;在提升污水处理效能、保障城市水环境安全、实现精细化管…

数据资产可能是个伪命题?

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…

【分享】跨境虾皮Shopee各区域商品详情API返回值(商品,订单,面单等)♥

虾皮(shopee)是一个亚洲区域的电商平台&#xff0c;主要在东南亚地区提供电商服务。虾皮提供了丰富的电商数据&#xff0c;包括商品数据、订单数据、会员数据、评价数据等。 虾皮Shopee♥♥​​​​​​​♥​​​​​​​♥​​​​​​​♥​​​​​​​♥ 1.授权 ​ 接口…

Matlab 将数据写入excel文件

Matlab 将数据写入excel文件 函数&#xff1a;writematrix 功能&#xff1a;将矩阵写入文件 语法 writematrix(A) writematrix(A,filename) writematrix(___,Name,Value) 说明 writematrix(A) 将同构数组 A 写入以逗号分隔的文本文件。文件名为数组的工作区变量名称&…

点动、电子凸轮、电子齿轮

一、常见的运动模式有三种 1、点位运动&#xff1a;进队终点的位置有要求&#xff0c;不在乎运动轨迹。要求定位速度快。可分为JOG电动、MOVE寸动、和VMOVE持续运动三类。 2、连续轨迹运动&#xff1a;也称为插补&#xff0c;系统在高速运动的情况下&#xff0c;既要保证轮廓…

中文分词,c++应用,想到jieba分词,结果还的自己封装。探索中

一、研究背景 随着互联网的快速发展&#xff0c;信息也呈了爆炸式的增长趋势。在海量的信息中&#xff0c;我们如何快速抽取出有效信息成为了必须要解决的问题。由于信息处理的重复性&#xff0c;而计算机又善于处理机械的、重复的、有规律可循的工作&#xff0c;因此自然就…

技术必备:接口自动化测试数据校验神器【JSonPath】

我们今天不讲如何开发一款自定义开发校验规则库&#xff0c;而是给大家分享一款在开发自定义校验规则库或者常规的接口自动化测试时&#xff0c;经常会用到的一款数据提取神器&#xff1a;JSonPath。 1. JSonPath介绍 JSonPath是一种简单的方法来提取给定JSON文档的部分内容。…

Visual Components对重型机械工业的影响 衡祖仿真

一、重型机械行业面临的挑战 此行业制造商面临着许多挑战&#xff0c;首先是世界各地实施的环境法规不断增多&#xff0c;可持续建筑实践、改善空气质量和减少排放已成为产品设计和开发背后的主要驱动力&#xff0c;健康和安全标准也在不断发展&#xff0c;给已经面临熟练劳动…

Mongodb入门--头歌实验MongoDB 复制集 分片

一、MongoDB之副本集配置 1.1MongoDB主从复制 主从复制是MongoDB最早使用的复制方式&#xff0c; 该复制方式易于配置&#xff0c;并且可以支持任意数量的从节点服务器&#xff0c;与使用单节点模式相比有如下优点&#xff1a; 在从服务器上存储数据副本&#xff0c;提高了数…

机器学习——模型融合:Boosting算法

机器学习——模型融合&#xff1a;Boosting算法 1. Boosting核心思想 Boosting算法是一种集成学习方法&#xff0c;其核心思想是通过组合多个弱学习器&#xff08;即准确率略高于随机猜测的学习器&#xff09;来构建一个强学习器&#xff08;即准确率较高的学习器&#xff09…

【C++】——list的介绍及使用 模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.…

open-sora

Open-Sora&#xff0c;高效复现类Sora视频生成方案开源&#xff01;魔搭社区最佳实践教程来啦&#xff01;https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

蓝桥杯真题Day48 倒计时5天 练了几道真题小程序+回溯剪枝应用一个小程序

[蓝桥杯 2023 省 A] 更小的数 题目描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从0到 n−1&#xff0c;你可以将其视作是一个具有n位的十进制数字num&#xff0c;小蓝可以从num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次…