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

news2025/6/10 7:00:04

一,前言

继续学习

二,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.coloradmin.cn/o/2406331.html

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

相关文章

华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…

【动态规划】B4336 [中山市赛 2023] 永别|普及+

B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦&#xff0c;梦里有一个字符串&#xff0c;这个字符串无论正着读还是倒着读都是一样的&#xff0c;例如&#xff1a; a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么&#xff0c;只记得…

可下载旧版app屏蔽更新的app市场

软件介绍 手机用久了&#xff0c;app越来越臃肿&#xff0c;老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法&#xff0c;还能帮我们卸载不需要的app。 手机现状 如今的app不断更新&#xff0c;看似在优化&#xff0c;实则内存占用越来越大&#xff0c;对手机性…

claude3.7高阶玩法,生成系统架构图,国内直接使用

文章目录 零、前言一、操作指南操作指导 二、提示词模板三、实战图书管理系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 在线考试系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 四、感受 零、前言 现在很多AI大模型可以…

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~

MySQL 基础概念 数据&#xff08;Data&#xff09;&#xff1a;文本&#xff0c;数字&#xff0c;图片&#xff0c;视频&#xff0c;音频等多种表现形式&#xff0c;能够被计算机存储和处理。 **数据库&#xff08;Data Base—简称DB&#xff09;&#xff1a;**存储数据的仓库…

2025-06-01-Hive 技术及应用介绍

Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具&#xff0c;它为海量结构化数据提供类 SQL 的查询能力&#xf…

AI书签管理工具开发全记录(十八):书签导入导出

文章目录 AI书签管理工具开发全记录&#xff08;十八&#xff09;&#xff1a;书签导入导出1.前言 &#x1f4dd;2.书签结构分析 &#x1f4d6;3.书签示例 &#x1f4d1;4.书签文件结构定义描述 &#x1f523;4.1. ​整体文档结构​​4.2. ​核心元素类型​​4.3. ​层级关系4.…

docker容器互联

1.docker可以通过网路访问 2.docker允许映射容器内应用的服务端口到本地宿主主机 3.互联机制实现多个容器间通过容器名来快速访问 一 、端口映射实现容器访问 1.从外部访问容器应用 我们先把之前的删掉吧&#xff08;如果不删的话&#xff0c;容器就提不起来&#xff0c;因…

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗

加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统&#xff0c;彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年&#xff0c;沉淀医疗技术、计算机科学与人工智能经验&#xff0c;聚焦医疗保健领域&#xff0c;提供AR、AI、IoT解决方案。 该方案使医疗…

Modbus转Ethernet IP深度解析:磨粉设备效率跃升的底层技术密码

在建材矿粉磨系统中&#xff0c;开疆智能Modbus转Ethernet IP网关KJ-EIP-101的应用案例是一个重要的技术革新。这个转换过程涉及到两种主要的通信协议&#xff1a;Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;广泛应用于工业控制系统中。它简单、易于部署和维护…

在MobaXterm 打开图形工具firefox

目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前&#xff08;YUM&#xff09; sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…

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

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

运动控制--BLDC电机

一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换&#xff0c;典型应用于电动工具、玩具等 1.2 无刷直流电机&#xff08;BLDC&#xff09; 电子换向替代机械电刷&#xff0c;具有高可靠性&#xff0c;常用于无人机、高端家电…

Redis专题-实战篇一-基于Session和Redis实现登录业务

GitHub项目地址&#xff1a;https://github.com/whltaoin/redisLearningProject_hm-dianping 基于Session实现登录业务功能提交版本码&#xff1a;e34399f 基于Redis实现登录业务提交版本码&#xff1a;60bf740 一、导入黑马点评后端项目 项目架构图 1. 前期阶段2. 后续阶段导…

【前端实战】如何让用户回到上次阅读的位置?

目录 【前端实战】如何让用户回到上次阅读的位置&#xff1f; 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法&#xff1a;监听滚动&#xff0c;记录 scrollTop&#xff08;不推荐&#xff09; 2、Intersection Observer 插入探针元素 3、基…

dvwa11——XSS(Reflected)

LOW 分析源码&#xff1a;无过滤 和上一关一样&#xff0c;这一关在输入框内输入&#xff0c;成功回显 <script>alert(relee);</script> MEDIUM 分析源码&#xff0c;是把<script>替换成了空格&#xff0c;但没有禁用大写 改大写即可&#xff0c;注意函数…

【Axure高保真原型】图片列表添加和删除图片

今天和大家分享图片列表添加和删除图片的原型模板&#xff0c;效果包括&#xff1a; 点击图片列表的加号可以显示图片选择器&#xff0c;选择里面的图片&#xff1b; 选择图片后点击添加按钮&#xff0c;可以将该图片添加到图片列表&#xff1b; 鼠标移入图片列表的图片&…

XXE漏洞知识

目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例&#xff1a;文件读取&#xff08;需要Apache >5.4版本&#xff09; 案例&#xff1a;内网探测&#xff08;鸡肋&#xff09; 案例&#xff1a;执行命…

mq安装新版-3.13.7的安装

一、下载包&#xff0c;上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量&#xff0c;直接就安装了。 erl…

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集

基于深度学习YOLOv11的盲人障碍物目标检测&#xff1a;开启盲人出行新纪元 在全球范围内&#xff0c;盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步&#xff0c;许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中&#xff…