Vue3学习(接口,泛型,自定义类型,v-for,props)

一,前言

继续学习

二,TS接口泛型自定义类型

1.接口

TypeScript 接口(Interface)是一种定义对象形状的强大工具,它可以描述对象必须包含的属性、方法和它们的类型。接口不会被编译成 JavaScript 代码,仅在编译阶段用于类型检查。

基本语法与用法

接口使用 interface 关键字定义,下面是一些常见用法:

// 定义基本接口
interface User {name: string;age: number;//“?” 表明该属性是可选的,其数据类型为布尔型(即值只能是 true 或 false)。“readonly id: string;” 表示定义一个名为 “id” 的属性,“readonly” 关键字意味着这个属性一旦被赋值就不能再被修改isAdmin?: boolean; // 可选属性readonly id: string; // 只读属性greet: (message: string) => void; // 方法
}// 使用接口
const user: User = {name: "张三",age: 30,id: "user123",greet: (message) => console.log(`${message}, ${this.name}`)
};// 接口继承
interface AdminUser extends User {role: string;
}// 函数接口
interface Calculator {(a: number, b: number): number;
}const add: Calculator = (a, b) => a + b;// 可索引接口
interface StringArray {[index: number]: string;
}const names: StringArray = ["Alice", "Bob"];

高级特性

接口还支持更复杂的类型定义:

// 混合类型接口(对象 + 函数)
interface Counter {(): void; // 函数签名count: number; // 属性
}function createCounter(): Counter {const counter = () => counter.count++;counter.count = 0;return counter;
}// 接口合并(同名接口会自动合并)
interface Box {height: number;
}interface Box {width: number;
}const box: Box = { height: 10, width: 20 };

最佳实践

  1. 使用接口定义对象形状,特别是在大型项目中
  2. 使用类型别名处理联合类型、交叉类型等复杂类型
  3. 保持接口名称简洁明了,通常使用名词或形容词 + 名词
  4. 为可选属性添加 ? 标记,为只读属性添加 readonly 标记

接口是 TypeScript 类型系统的核心组成部分,合理使用可以显著提高代码的可读性和可维护性。

2.泛型

泛型是 TypeScript 中一个强大的特性,它允许我们创建可重用的组件,同时保持类型安全。泛型让我们可以在定义函数、接口或类时不预先指定具体类型,而是在使用时再确定类型。

基本泛型函数

// 泛型函数示例
function identity<T>(arg: T): T {return arg;
}// 使用泛型函数
const output1 = identity<string>("myString"); // 显式指定类型
const output2 = identity(100); // 类型推断为 number

泛型接口

// 泛型接口
interface GenericIdentityFn<T> {(arg: T): T;
}function identity<T>(arg: T): T {return arg;
}const myIdentity: GenericIdentityFn<number> = identity;

泛型类

// 泛型类
class GenericNumber<T> {zeroValue: T;add: (x: T, y: T) => T;
}const myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = (x, y) => x + y;

3,自定义类型

自定义类型允许我们创建复杂的、特定用途的类型定义,提高代码的可读性和类型安全性。

类型别名(Type Aliases)

// 基本类型别名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;// 复杂类型别名
type UserInfo = {name: string;age: number;address?: string;
};// 泛型类型别名
type Container<T> = { value: T };

交叉类型(Intersection Types)

// 交叉类型
interface Colorful {color: string;
}interface Circle {radius: number;
}type ColorfulCircle = Colorful & Circle;const cc: ColorfulCircle = {color: "red",radius: 10
};

联合类型

// 联合类型
type StringOrNumber = string | number;
type Text = string | { text: string };// 字面量类型
type Easing = "ease-in" | "ease-out" | "ease-in-out";

**条件类型

// 条件类型
type MessageOf<T> = T extends { message: unknown } ? T["message"] : never;interface Email {message: string;
}type EmailMessageContents = MessageOf<Email>; // string

映射类型

// 映射类型
interface User {name: string;age: number;email: string;
}// 创建只读版本
type ReadonlyUser = {readonly [P in keyof User]: User[P];
};// 创建可选版本
type PartialUser = {[P in keyof User]?: User[P];
};

三,v-for指令

v-for 是 Vue.js 中用于循环渲染列表的指令,它允许你基于数组或对象的数据来动态生成 DOM 元素。

基本用法

v-for 指令的基本语法是 item in items,其中 items 是源数据数组,而 item 是当前被迭代的数组元素的别名。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Vue v-for 简单示例</title><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script><style>body { font-family: Arial, sans-serif; }.example { margin-bottom: 30px; padding: 15px; border: 1px solid #eee; }ul { list-style-type: none; padding: 0; }li { margin: 5px 0; }</style>
</head>
<body><div id="app"><!-- 示例1:循环数组 --><div class="example"><h3>1. 循环数组</h3><ul><li v-for="(item, index) in fruits" :key="index">{{ index + 1 }}. {{ item }}</li></ul></div><!-- 示例2:循环对象 --><div class="example"><h3>2. 循环对象</h3><ul><li v-for="(value, key) in user" :key="key">{{ key }}: {{ value }}</li></ul></div><!-- 示例3:循环数字 --><div class="example"><h3>3. 循环数字</h3><p>前 {{ count }} 个数字的平方:</p><ul><li v-for="n in count" :key="n">{{ n }} × {{ n }} = {{ n * n }}</li></ul></div></div><script>new Vue({el: '#app',data: {fruits: ['苹果', '香蕉', '橙子', '草莓'],user: {name: '张三',age: 28,email: 'zhangsan@example.com'},count: 5}})</script>
</body>
</html>
  1. key 的重要性
    • 为每个 v-for 项提供唯一的 key 是最佳实践,它帮助 Vue 跟踪节点的身份,从而高效地更新 DOM。
    • 避免使用索引作为 key,特别是当列表可能会重新排序或过滤时,这可能导致性能问题或错误的更新。
  2. 响应式更新
    • Vue 能够检测到数组的变更方法(如 push、pop、splice 等)并触发相应的 DOM 更新。
    • 直接修改数组索引或长度不会触发响应式更新,应使用 Vue 提供的方法。
  3. 过滤和排序
    • 当需要显示过滤或排序后的结果时,应使用计算属性或方法,而不是在 v-for 中直接操作。

四,props

props 是 Vue 组件中用于从父组件向子组件传递数据的机制。它允许你创建可复用的组件,同时保持数据的单向流动。

index.ts

// 定义一个接口,用于限制person对象的具体属性
export interface PersonInter
{name: string;age: number;sex: string;
}// 一个自定义类型
export type Persons = PersonInter[]

App.vue

<template><person a="hh":list="personlist"/>
</template>
<script  lang="ts" setup name="App">
import person from './components/person.vue';
import { reactive } from 'vue';
import { type Persons} from './types';
let personlist = reactive<Persons>([{name:'张三',age:18,sex:'男',},{name:'李四',age:19,sex:'男',},{name:'王五',age:20,sex:'男'},])
</script>

person.vue

<template><div class="person"><h2>{{a}}</h2>
<ul><li v-for="p in list" :key="p.id">{{p.name}} {{p.age}}</li>
</ul></div>
</template>
<script lang="ts" setup name="Person">
import { defineProps }   from 'vue';
// // 接收a参数和list
defineProps(['a','list'])
// // 接收a参数,同时将props保存起来
// let x = defineProps(['a'])
// console.log(x.a)
</script>
<style></style>

大概就是这样,反正就是从父组件那里搞点数据,还有很多别的用法遇到了再说。

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

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

相关文章

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …

Java八股文——Redis篇

目录 1. 缓存穿透解决方案1. 缓存空值2. 布隆过滤器&#xff08;Bloom Filter&#xff09;3. 参数校验4. 接口限流与验证码 2. 缓存击穿解决方案1. 设置热点数据永不过期&#xff08;或很长过期时间&#xff09;2. 使用互斥锁&#xff08;如分布式锁&#xff09;3. 利用异步更新…

旋量理论:刚体运动的几何描述与机器人应用

旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比&#xff0c;旋量理论通过螺旋运动的概念统一了旋转和平移&#xff0c;在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观&#xff0c;而且计算…

Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪

Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪 自己研一期间的小论文大致上的结构和内容基本上已经完成&#xff0c;到了最后在测试集上测试数据的阶段&#xff0c;在跑测试集的时间上就去看一些25年和多目标跟踪的领域相关的一些内…

MyBatis中foreach集合用法详解

在 MyBatis 中&#xff0c;<foreach> 标签用于遍历集合&#xff08;Collection、List、Array、Map&#xff09;&#xff0c;常用于构建动态 SQL 语句&#xff08;如 IN 查询、批量插入等&#xff09;。以下是详细用法和示例&#xff1a; 核心属性 属性描述collection必填…

今日学习:ES8语法 | Spring整合ES | ES场景八股

文章目录 ES81 ES架构2 ES适用场景3 ES使用3.1对比mysql3.2 索引(Index)3.3 类型(Type)3.4 文档(Document)3.5 字段(Field)3.6 映射(Mapping) 4 ElasticSearch 基础功能4.1 分词器4.2 索引操作4.2.1 创建索引4.2.2 查看所有索引4.2.3 查看单个索引4.2.4 删除索引 4.3 文档操作4…

力扣刷题(第五十一天)

灵感来源 - 保持更新&#xff0c;努力学习 - python脚本学习 存在重复元素 II 解题思路 这个问题可以通过哈希表来高效解决。具体思路如下&#xff1a; 使用哈希表记录元素最后一次出现的位置&#xff1a;遍历数组&#xff0c;用一个哈希表存储每个元素的最后一次出现的…

基于 Vue3 + Element Plus 实现的智能题目生成页面设计思路

在本篇文章中&#xff0c;我将分享一个基于 Vue3 Element Plus 构建的「智能题目生成页面」的实现思路与设计理念。该页面作为在线学习平台的一部分&#xff0c;核心功能是&#xff1a;用户上传学习资料&#xff0c;AI 自动为其生成定制化题目。以下将从页面风格、功能模块、交…

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…

《P1801 黑匣子》

题目描述 Black Box 是一种原始的数据库。它可以储存一个整数数组&#xff0c;还有一个特别的变量 i。最开始的时候 Black Box 是空的&#xff0e;而 i0。这个 Black Box 要处理一串命令。 命令只有两种&#xff1a; ADD(x)&#xff1a;把 x 元素放进 Black Box; GET&#x…

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…

Server - 使用 Docker 配置 PyTorch 研发环境

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…

HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命​

​​CodeGenie&#xff1a;鸿蒙生态的AI编程革命​​ 华为推出的 ​​CodeGenie​​ 是集成于 DevEco Studio 的 AI 辅助编程工具&#xff0c;专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力&#xff0c;显著提升开发效率&#xff0c;降低鸿蒙生…

大模型模型部署和暴露接口

创建环境 激活案件 安装相关依赖 conda create -n fastApi python3.10 conda activate fastApi conda install -c conda-forge fastapi uvicorn transformers pytorch pip install safetensors sentencepiece protobuf 新建文件夹 mkdir App cd App touch main.py 复制代码…

Redis初入门

Nosql&#xff1a;Not-Only SQL&#xff08;泛指非关系型数据库&#xff09;&#xff0c;作为关系型数据库的补充 作用&#xff1a;应对基于海量用户和海量数据前提下的数据处理问题 redis&#xff1a;C语言开发的一个开源的高性能键值对数据库 特征&#xff1a; 1、数据之…

【原神 × 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密!

【原神 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密! 作者:星之辰 标签:#原神 #二叉树 #天赋树 #任务分支 #圣遗物强化 #算法科普 发布时间:2025年6月 总字数:6000+ 一、引子:提瓦特大陆的“树型奥秘” 你是否曾留意过《原神》角色面板的天赋树? 升级技能…

C++信息学竞赛中常用函数的一般用法

在C 信息学竞赛中&#xff0c;有许多常用函数能大幅提升编程效率。下面为你介绍一些常见函数及其一般用法&#xff1a; 一、比较函数 1、max()//求出a&#xff0c;b的较大值 int a10,b5,c;cmax(a,b);//得出的结果就是c等于10. 2、min()//求出a&#xff0c;b的较小值 int a1…

Linux【3】-----系统框架概述

系统架构 文件系统 linux一定需要挂载操作系统 一切皆文件 三个文件 引导文件 uboot.bin内核镜像 zImage文件系统镜像 system.img 设备树文件&#xff08;属于内核&#xff09; 应用程序编程 arm中通过软中断实现 各程序的构成 文件I/O 5种I/O模型 阻塞非阻塞信号多…