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
繁體地址,請注明出處:http://hk.pswp.cn/news/908766.shtml
英文地址,請注明出處:http://en.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模型 阻塞非阻塞信號多…