当前位置: 首页 > news >正文

Vue3+Ts函数封装与应用

目录

一、基础函数

二、实际应用

2.1、根据id找到对应的value值(找第一个)

2.2、根据id找到对应的value值(找所有)

2.3、不重复的升序数组找数字(二分查找)

2.4、重复的无序数组找数字(统计个数)

2.5、将数组整理为树结构(省市区为例)

为什么要积累呢?因为面试的时候总是问:在开发过程中有没有封装过一些hooks?

一、基础函数

先准备一个textHook.ts文件,在里面定义相关函数,并抛出

export function sayHello(name: string): string {return `Hello,${name}`;
}
export function add(a: number, b: number): number {return a + b;
}

在HTML文件里具体应用:

<template><p>{{ helloMessage }}</p> <!-- 结果为:Hello,Vue3+ts --><p>{{ sum }}</p> <!-- 结果为:8 -->
</template>
<script lang="ts" setup>
import { sayHello, add } from "@/hooks/textHook";
const helloMessage = ref<string>(sayHello("Vue3+ts"));
const sum = ref<number>(add(5, 3));
</script>

二、实际应用

2.1、根据id找到对应的value值(找第一个)

页面应用如下:

<template><!-- 参数:(任意值,它在该数组中对应的属性名,数组,要找的属性名) --><!-- 返回: 根据该值要找的属性名的值--><p>{{ findKey(2, "value", emergencyLevel, "desc") }}</p><!-- 结果为:紧急 -->
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { findKey } from "@/hooks/textHook";
const emergencyLevel = reactive([{name: "VERY_URGENT",desc: "非常紧急",value: 3,},{name: "URGENT",desc: "紧急",value: 2,},{name: "GENERAL",desc: "一般",value: 1,},
]);
</script>

hooks.ts如下:

interface ItemWithValue {[key: string]: any;
}
export function findKey<T extends ItemWithValue>(inputValue: number | string,inputKey: string,arrs: T[],targetKey: string
) {const result = arrs.find((item) => item[inputKey] === inputValue);return result ? result[targetKey] : null;
}

2.2、根据id找到对应的value值(找所有)

假设数组长这样:

    <!-- 参数:(任意值,它在该数组中对应的属性名,数组,要找的属性名) --><!-- 返回: 根据该值要找的属性名的所有值--><p>{{ findMutiKey(2, "id", arrs, "title").toString() }}</p><!-- 结果为:Item 2,Item 2——Cpoyvalue -->
const arrs = reactive([{ id: 1, title: "title 1" },{ id: 2, title: "title 2" },{ id: 2, title: "title 2——Cpoyvalue" },{ id: 3, title: "title 3" },
]);

hook.ts如下:

export function findMutiKey<T extends ItemWithValue>(inputValue: number | string,inputKey: string,arrs: T[],targetKey: string
): T[] {// 使用filter找到所有匹配的对象const result = arrs.filter((item) => item[inputKey] === inputValue);// 从匹配的对象中提取出对应键的值return result ? result.map((result) => result[targetKey]) : [];
}

一般来说会直接在页面里写个方法,比如下面:

<span>{{ getEmergencyDescription(detail.urgent_level) }}</span>const getEmergencyDescription = (level: number) => {const emergency = emergencyLevel.find((item) => item.value === level);return emergency ? emergency.desc : "";
};

但是这样只能给这一种情况使用,还是要封装大众化函数,可以适配各种情况。

2.3、不重复的升序数组找数字(二分查找)

  <!-- 参数:(数组,指定数字) --><!-- 返回:找到返回下标,找不到返回-1 --><p>{{ findAsceOrderIndex(indexArrs, 12) }}</p><p>{{ findAsceOrderIndex(indexArrs, 999) }}</p>const indexArrs = ref([1, 5, 8, 12, 34, 89, 137]);

hook.ts如下:

export function findAsceOrderIndex(arrs: number[], target: number): number | null {let left = 0;let right = arrs.length - 1;while (left < right) {const mid = Math.floor((left + right) / 2);if (arrs[mid] === target) {return mid; //直接找到} else if (arrs[mid] < target) {left = mid + 1; //搜右半部分} else {right = mid - 1; //搜左半部分}}return null;
}

时间复杂度是 O(log⁡n)【执行时间与输入数据规模的对数成正比】,非常适合处理有序数组。

这样比直接遍历整个数组节省了至少一半的性能。

2.4、重复的无序数组找数字(统计个数)

  <p>{{ findDisorderLength(indexArrs, 9) }}</p><!-- 结果是:2 -->
const indexArrs = ref([1, 9, 3, 55, 7, 11, 50, 9, 11]);export function findDisorderLength(arrs: number[], target: number): number {const result = arrs.map((item, index) => (item === target ? index : -1)).filter((index) => index !== -1);// 第一步map后剩下[ -1, 1, -1, -1, -1, -1, -1, 7, -1 ]// 第二步filter后剩下[ 1,7 ]return result ? result.length : 0;
}

2.5、将数组整理为树结构(省市区为例)

  <p>{{ buildTree(regionList,"parentCode", "code") }}</p>export function buildTree<T extends { [key: string]: any }>(list: T[],parentKey: keyof T,key: keyof T
): T[] {const map = new Map<T[keyof T], T>();const tree: T[] = [];// 构建一个以parentCode为键的maplist.forEach((item) => {map.set(item[key], { ...item, children: [] });});list.forEach((item) => {const child = map.get(item[key]);if (child && item[parentKey] !== undefined && item[parentKey] !== null) {const parent = map.get(item[parentKey]);// 有父地区:将当前地区添加到父地区的children里if (parent) {parent.children?.push(child);}} else if (child) {tree.push(child);//顶层地区}});return tree;
}

备注:

操作符keyof:用于获取一个类型的所有键(属性名)的联合类型

未完待续......

相关文章:

Vue3+Ts函数封装与应用

目录 一、基础函数 二、实际应用 2.1、根据id找到对应的value值(找第一个) 2.2、根据id找到对应的value值(找所有) 2.3、不重复的升序数组找数字(二分查找) 2.4、重复的无序数组找数字(统计个数) 2.5、将数组整理为树结构(省市区为例) 为什么要积累呢&#xff1f;因为面…...

C语言全局变量和局部变量同时应用的题题型[求一堆数组中10个学生的成绩里最高分、最低分和平均分。]

C语言函数 全局变量与局部结合变量题。 本片代码中包含全局变量max和min。 以及局部变量aver。 全局变量运用于从定义变量开始&#xff0c;局部变量运用于定义它的调用函数内。 正文开始: #include <stdio.h> int max0,min0; int main() { int average(int array[…...

深度学习实战94-基于图卷积神经网络GCN模型的搭建以及在金融领域的场景

大家好,我是微学AI,今天给大家介绍一下深度学习实战94-基于图卷积神经网络GCN模型的搭建以及在金融领域的场景。文章首先介绍了GCN模型的原理及模型结构,随后提供了数据样例,并详细展示了实战代码。通过本文,读者可以深入了解GCN模型在金融场景下的应用,同时掌握代码的具…...

.NET 6新特性 | System.Text.Json功能改进

在.NET 6.0中&#xff0c;JSON处理库得到了显著的改进&#xff0c;主要体现在System.Text.Json上。以下是对.NET 6.0中改进的JSON处理库的详细分析&#xff1a; 一、System.Text.Json的引入与优势 在.NET 6中&#xff0c;Microsoft引入了新的JSON库System.Text.Json作为官方推…...

Matlab如何对全局优化算法启动并行计算

在 MATLAB 中&#xff0c;启用并行计算可以显著提高一些优化算法&#xff08;如遗传算法 ga 和粒子群算法 particleswarm&#xff09;的速度&#xff0c;特别是在种群或粒子群较大时。要启用并行计算&#xff0c;可以使用 UseParallel 参数。 1. 启用并行计算步骤 Step 1: 检…...

MYSQL-查看数据库中的存储过程语法(六)

13.7.5.9 SHOW CREATE PROCEDURE 语句 SHOW CREATE PROCEDURE proc_name此语句是 MySQL 扩展。它返回确切的字符串 &#xff0c;可用于重新创建命名的存储过程。SHOW CREATE FUNCTION&#xff0c;显示有关存储函数的信息 &#xff08;参见第 13.7.5.8 节“ SHOW CREATE FUNCTI…...

【深度学习】(12)--模型部署 <连接客户端与服务端>

文章目录 模型部署一、模型部署的定义与目的二、模型部署的步骤三、模型部署的方式四、Flask框架五、实现模型部署1. 搭建服务端1.1 初始化Flask app1.2 加载模型1.3 数据预处理1.4 构建装饰器1.5 完整代码 2. 搭建客户端2.1 服务端网址2.2 发送请求2.3 完整代码 六、运行使用 …...

优化SQL查询的最佳实践:提升数据库性能的关键

SQL 查询是数据库操作的核心&#xff0c;特别是当数据量庞大时&#xff0c;性能问题尤为明显。优化 SQL 查询不仅能减少响应时间&#xff0c;还能提高系统整体的可伸缩性。本文将从索引、查询结构、数据库设计和缓存等方面详细介绍如何优化 SQL 查询以提升性能。 一、索引的使…...

【AIGC视频生成】视频扩散模型(综述+最新进展)

文章目录 一、综述1.1 扩散模型1.1.1 Denoising Diffusion Probabilistic Models (DDPMs)1.1.2 Score-Based Generative Models (SGMs)1.1.3 Stochastic Differential Equations (Score SDEs) 1.2 相关任务1.3 数据集1.4 评价指标 二、年度进展1.runway gen2.1 Gen-1&#xff1…...

如何下载3GPP协议?

一、进入3GPP网页 https://www.3gpp.org/ 二、点击“Specifications &Technologies” 三、点击“FTP Server” 网址&#xff1a; https://www.3gpp.org/specifications-technologies 四、找到“latest”&#xff0c;查看最新版 网址&#xff1a; https://www.3gpp.org/ftp…...

目标检测系统操作说明【用户使用指南】(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

1.100多种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 2.目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09; 3.目标检测系统【环境详细配置过程】&#xff08;CPU版本&#xff0…...

Vue中使用路由

目录 单页应用程序&#xff1a;SPA - Single Page Application路由 VueRouterVueRouter使用步骤组件存放目录问题 路由模块封装声明式导航 - 导航连接两个类名自定义匹配类名 声明式导航 - 跳转传参Vue路由 - 重定向Vue路由 - 404Vue路由 - 模式设置 编程式导航 - 基本跳转编程…...

【Linux】多线程安全之道:互斥、加锁技术与底层原理

目录 1.线程的互斥 1.1.进程线程间的互斥相关背景概念 1.2.互斥量mutex的基本概念 所以多线程之间为什么要有互斥&#xff1f; 为什么抢票会抢到负数&#xff0c;无法获得正确结果&#xff1f; 为什么--操作不是原子性的呢&#xff1f; 解决方式&#xff1a; 2.三种加锁…...

收藏多年的四款音频剪辑工具你pick哪一个?

在这个时代&#xff0c;音频剪辑已经成为音乐制作、播客、自媒体等领域的必备技能。而随着网络技术的飞速发展&#xff0c;我们不再需要安装庞大的软件&#xff0c;只需一个浏览器&#xff0c;就能轻松完成音频剪辑工作。今天&#xff0c;就让我为大家推荐几款优秀的在线音频剪…...

使用Redis进行在线人数统计时,有哪些性能优化技巧?

使用Redis进行在线人数统计时&#xff0c;性能优化是关键&#xff0c;以下是一些性能优化技巧&#xff1a; 选择合适的数据结构&#xff1a; 对于在线人数统计&#xff0c;可以选择使用Set数据结构&#xff0c;因为它具有自动去重和高效的集合操作特性&#xff0c;非常适合用于…...

前端模块循环依赖问题

模块循环依赖问题 在项目比较小的时候可能不怎么会遇到这个问题&#xff0c;但项目一旦有一定的体量后就可能会遇到了。 我之前做项目时就遇到这个问题&#xff0c;也是总结一篇文章。 比如这种类型的报错 commonjs存在的问题 先讲一下commonjs存在的问题。 CommonJS模块采…...

Springboot指定扫描路径

方式一&#xff1a;通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…...

【Flutter】Dart:环境搭建

Flutter 是一个基于 Dart 的跨平台开发框架&#xff0c;可以帮助我们快速构建移动应用程序。在开始 Flutter 开发之前&#xff0c;我们需要先搭建 Dart 的开发环境&#xff0c;并配置合适的编辑器&#xff0c;比如 VSCode。本教程将引导你一步步完成 Dart 和 Flutter 的环境搭建…...

OpenCV高级图形用户界面(10)创建一个新的窗口函数namedWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个窗口。 函数 namedWindow 创建一个可以作为图像和跟踪条占位符的窗口。创建的窗口通过它们的名字来引用。 如果已经存在同名的窗口&am…...

水题四道。

我的 水题四道--题目目录 问题 A: 依次输出第k小整数 代码1 问题 B: 第k小整数(knumber) 代码2 树的统计 代码3 枪声问题 代码4 问题 A: 依次输出第k小整数 现有n个正整数&#xff0c;n≤10000&#xff0c;要求出这n个正整数中的第1小的整数&#xff0c;第2小的整数&#xf…...

Python爬虫实战:用Qwen2.5-VL智能解析网页图片内容

Python爬虫实战&#xff1a;用Qwen2.5-VL智能解析网页图片内容 1. 引言 你有没有遇到过这样的情况&#xff1a;爬取了大量网页图片&#xff0c;却要人工一张张查看内容&#xff1f;或者需要从海量图片中筛选出特定类型的商品、识别图中的文字信息&#xff1f;传统爬虫只能获取…...

【2026新版】 DirectX Repair 修复工具操作步骤【图文教程】,DirectX修复工具彻底解决DirectX报错与游戏闪退

DLL缺失、游戏闪退及DirectX错误 要怎么处理&#xff1f;DirectX修复工具可以快速修复DLL缺失、游戏闪退及DirectX错误&#xff0c;支持一键扫描和自动修复。DirectX修复工具是一款专门给 Windows 系统打补丁的小程序&#xff0c;可以把电脑里缺失或损坏的 DirectX 文件重新补全…...

seo兼职如何做外链建设_seo兼职如何进行社交媒体优化

SEO兼职如何做外链建设 在当今互联网时代&#xff0c;外链建设无疑是SEO&#xff08;搜索引擎优化&#xff09;中最重要的一环。对于SEO兼职者来说&#xff0c;如何有效地进行外链建设是一项必须掌握的技能。本文将从问题分析、原因说明、解决方法及注意事项四个方面&#xff…...

Tubular部署与配置教程:从源码编译到F-Droid发布的完整流程

Tubular部署与配置教程&#xff1a;从源码编译到F-Droid发布的完整流程 【免费下载链接】Tubular A fork of NewPipe that implements SponsorBlock and ReturnYouTubeDislike. 项目地址: https://gitcode.com/gh_mirrors/tu/Tubular Tubular是一款基于NewPipe开发的增强…...

Go的unsafe.Pointer与uintptr:手动内存管理的风险与收益

Go语言以其简洁的内存管理模型著称&#xff0c;但标准库中的unsafe包却为开发者提供了手动操作内存的能力。unsafe.Pointer与uintptr这两个类型&#xff0c;允许绕过Go的类型安全检查&#xff0c;直接与底层内存交互。这种能力虽然强大&#xff0c;却也伴随着极高的风险。本文将…...

Gephi新手必看:如何用Excel表格快速创建你的第一个社交网络图

Gephi新手必看&#xff1a;如何用Excel表格快速创建你的第一个社交网络图 第一次打开Gephi时&#xff0c;那些复杂的界面和术语可能会让你望而却步。但别担心&#xff0c;就像用Excel做表格一样简单&#xff0c;我们完全可以用最熟悉的电子表格来构建专业的社交网络图。想象一下…...

测试小白福音:在快马上通过实战代码轻松攻克软件测试面试题

作为一名刚入门的软件测试新手&#xff0c;面对各种面试题时常常感到一头雾水。最近我发现了一个特别实用的学习方法 - 通过动手实践来理解测试理论。今天就来分享一下我的经验。 从基础概念入手 刚开始学习时&#xff0c;我连黑盒测试和白盒测试的区别都搞不清楚。后来发现&…...

罗技PUBG鼠标宏压枪技术全解析:从核心挑战到落地实践

罗技PUBG鼠标宏压枪技术全解析&#xff1a;从核心挑战到落地实践 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在PUBG等战术射击游戏中&#x…...

RTOS实时操作系统核心机制与工程实践解析

1. RTOS基础概念与适用场景解析实时操作系统&#xff08;Real-Time Operating System&#xff09;是嵌入式开发中经常遇到的核心组件。作为一名在工业控制领域摸爬滚打多年的工程师&#xff0c;我见过太多项目因为RTOS选型不当而导致的灾难性后果。与通用操作系统不同&#xff…...

深入Linux内核:RDMA Verbs API的object/method/attr三层模型设计与实现解析

深入Linux内核&#xff1a;RDMA Verbs API的object/method/attr三层模型设计与实现解析 在当今高性能计算和分布式存储领域&#xff0c;远程直接内存访问(RDMA)技术因其极低的延迟和高吞吐量而备受青睐。作为RDMA技术的核心接口&#xff0c;Verbs API的设计哲学直接影响着整个生…...