Vue中如何抽取部分代码到单独的ts文件
Vue中如何抽取部分代码到单独的ts文件
本文代码基于
简单示例
这段代码,是比较通用的代码,我想抽取成一个ts文件,来供其他地方调用。
const groupData = reactive({groupList:[] as Array<GroupV2Response>,current:{} as GroupV2Response,
})const groupFunc = new class {groupType = 1;loadGroupChildrenList = (parentGroupCode:string|null) => {axios.post("/gallery/group/query-group-children",{groupCode:parentGroupCode,type:this.groupType,}).then(resp => groupData.groupList = resp.data.data)}selectThisGroup = (group:GroupV2Response) => {groupData.current = group;this.loadGroupChildrenList(group.groupCode);}clearCurrentGroup = () => {groupData.current = {} as GroupV2Response;}
}
为了将这段代码抽取成一个 TypeScript 文件供其他地方调用,并且能够操作 Vue 的响应式变量,可以考虑以下几个步骤:
- 创建一个 TypeScript 文件:这个文件将包含类和响应式数据结构。
- 抽象出响应式状态:可以将响应式状态 (
reactive对象) 作为参数传递给类,使得这个类更加灵活和可重用。 - 导出类和响应式状态:从这个文件中导出你创建的类和函数,这样其他组件或文件就可以引用和实例化它。
步骤 1: 创建 TypeScript 文件
首先,创建一个新的 TypeScript 文件,例如命名为 GroupManager.ts。
步骤 2: 抽象出响应式状态
你可以修改类,让它接收一个响应式状态对象作为参数。这样,类就不依赖于外部的具体响应式变量了。
// GroupManager.ts
import { reactive } from 'vue';
import axios from 'axios';
import { GroupV2Response } from './path-to-type-definitions'; // 确保引入了正确的类型定义// 定义响应式状态接口
interface GroupData {groupList: Array<GroupV2Response>;current: GroupV2Response;
}export class GroupManager {private groupData: GroupData;groupType = 1;constructor(groupData: GroupData) {this.groupData = groupData;}loadGroupChildrenList = (parentGroupCode: string|null) => {axios.post("/gallery/group/query-group-children", {groupCode: parentGroupCode,type: this.groupType,}).then(resp => this.groupData.groupList = resp.data.data);}selectThisGroup = (group: GroupV2Response) => {this.groupData.current = group;this.loadGroupChildrenList(group.groupCode);}clearCurrentGroup = () => {this.groupData.current = {} as GroupV2Response;}
}// 可以提供一个工厂函数来创建和初始化响应式数据
export function createGroupManager() {const groupData: GroupData = reactive({groupList: [],current: {} as GroupV2Response,});return { groupData, groupManager };
}
步骤 3: 使用抽取的文件
在其他 Vue 组件中,你可以导入并使用这个抽象化了的类:
// SomeComponent.vue
<script setup lang="ts">
import { createGroupManager } from './GroupManager';const { groupData, groupManager } = createGroupManager();
</script>
这样,你就能够在不同的组件中复用 GroupManager 类,并且每个组件可以有自己的响应式状态实例,这使得组件更独立、更易于管理。
相应外部事件
要使得 GroupManager 类在执行特定方法(如 selectThisGroup)时能够与其他代码或组件进行交互,例如触发事件,你可以采用几种设计策略。这些策略通常涉及使用事件发射(emitting events)、回调函数或利用 Vue 的全局事件总线。下面,我将提供几种方法来实现这种交互。
方法 1: 使用事件发射(EventEmitter)
你可以使用一个事件发射器(EventEmitter)来在你的类中触发事件。这可以通过使用 Node.js 的 events 模块或一个简单的第三方事件库来实现。
安装事件库(例如 mitt,一个轻量级的事件库):
npm install mitt
修改 GroupManager 类:
// GroupManager.ts
import { reactive } from 'vue';
import axios from 'axios';
import mitt from 'mitt';
import { GroupV2Response } from './path-to-type-definitions';interface GroupData {groupList: Array<GroupV2Response>;current: GroupV2Response;
}export class GroupManager {public groupData: GroupData;groupType = 1;emitter = mitt(); // 创建事件发射器constructor(groupData: GroupData) {this.groupData = groupData;}loadGroupChildrenList = (parentGroupCode: string|null) => {axios.post("/gallery/group/query-group-children", {groupCode: parentGroupCode,type: this.groupType,}).then(resp => this.groupData.groupList = resp.data.data);}selectThisGroup = (group: GroupV2Response) => {this.groupData.current = group;this.loadGroupChildrenList(group.groupCode);this.emitter.emit('group-selected', group); // 触发事件}clearCurrentGroup = () => {this.groupData.current = {} as GroupV2Response;this.emitter.emit('group-cleared'); // 触发事件}on(eventName: string, handler: (event?: any) => void) {this.emitter.on(eventName, handler); // 提供方法来监听事件}off(eventName: string, handler: (event?: any) => void) {this.emitter.off(eventName, handler); // 提供方法来移除监听}
}
使用 GroupManager 类:
<script setup lang="ts">
import { createGroupManager } from './GroupManager';const { groupData, groupManager } = createGroupManager();groupManager.on('group-selected', (group) => {console.log('Selected group:', group);
});groupManager.on('group-cleared', () => {console.log('Group cleared');
});onUnmounted(() => {// 确保在组件卸载时移除事件监听器,避免内存泄漏groupManager.off('group-selected', handler);groupManager.off('group-cleared', handler);
});
</script>
方法 2: 使用回调函数
另一种方法是在 GroupManager 类的构造函数中接受一个或多个回调函数作为参数,当发生特定的动作时调用这些函数。
// GroupManager.ts
export class GroupManager {public groupData: GroupData;groupType = 1;private onSelectGroup: (group: GroupV2Response) => void;private onClearGroup: () => void;constructor(groupData: GroupData, onSelectGroup: (group: GroupV2Response) => void, onClearGroup: () => void) {this.groupData = groupData;this.onSelectGroup = onSelectGroup;this.onClearGroup = onClearGroup;}selectThisGroup = (group: GroupV2Response) => {this.groupData.current = group;this.loadGroupChildrenList(group.groupCode);this.onSelectGroup(group);}clearCurrentGroup = () => {this.groupData.current = {} as GroupV2Response;this.onClearGroup();}
}
在这种设计中,你可以在创建 GroupManager 实例时提供具体的回调函数,使得类的行为更加灵活。这种方式适合于较为简单的交互场景,且当交互逻辑较为固定时。
通过上述两种方法,你可以使 GroupManager 类在执行其内部方法时与外部代码有效交互,根据具体的应用场景选择适合的设计模式。
相关文章:
Vue中如何抽取部分代码到单独的ts文件
Vue中如何抽取部分代码到单独的ts文件 本文代码基于 简单示例 这段代码,是比较通用的代码,我想抽取成一个ts文件,来供其他地方调用。 const groupData reactive({groupList:[] as Array<GroupV2Response>,current:{} as GroupV2Re…...
山东齐鲁文化名人颜廷利:朱郭有文才,曲高‘菏’寡星光路
山东齐鲁文化名人颜廷利教授表示,朱郭(谐音‘祖国’)有文才,《曲高‘菏’寡》星光路… 山东菏泽歌手朱之文在2011年凭借一首《滚滚长江东逝水》一夜成名, 十多年之后的今天,菏泽市网络红人郭有才靠一首《诺…...
嵌入式学习70-复习(wireshark使用和http协议)
知识零碎: ssize_t 头文件:<sys/types.h> 有符号整型 --------------------------------------------------------------------------------------------------------------------------------- wireshark 1.sudo wireshark 2.选择 any &…...
idea配置MySQL提示
点击sql语句,然后再选择show context actions 然后再选择Inject language or reference 然后再选择MySQL 然后我们会发现sql语句变颜色了 如果表是红色 那么需要我们连接mysql的对于的数据库...
如何利用AI生成答辩PPT?笔灵AI答辩PPT,智能识别关键点
很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…...
速盾:怎么设置cdn加速小程序图片?
小程序是一种基于微信平台的应用程序,为了提升小程序的用户体验,我们可以通过设置CDN(内容分发网络)来加速小程序中的图片加载速度。CDN是一种分布式服务,它将原始服务器的存储内容复制到在全球各地的缓存服务器&#…...
Android bootchart 分析启动性能工具使用
bootchart简介 bootchart 可为整个系统提供所有进程的 CPU 和 I/O 负载细分。该工具不需要重建系统映像,可以用作进入 systrace 之前的快速健全性检查。 1. 板端配置: 在Android 板端启用 bootchart,请运行以下命令: 2. Bootch…...
一键开启,盲盒小程序里的梦幻奇遇
在这个充满惊喜与未知的数字时代,盲盒小程序以其独特的魅力成为了许多人的新宠。只需一键开启,你就能踏入一个充满梦幻奇遇的世界,探索未知的惊喜与乐趣。 盲盒小程序不仅仅是一个简单的购物平台,它更是一个充满神秘与惊喜的宝藏库…...
如何进行并行执行的诊断与调优 —— 《OceanBase 并行执行》系列 6
在诊断并行执行问题时,我们可以从两个主要方面展开分析。首先,从整体系统层面进行考量,比如检查网络是否畅通、磁盘IO是否过载、CPU资源是否已用满;其次,针对具体的SQL语句进行深入剖析,定位问题SQL&#x…...
【Ubuntu系统hgfs共享文件夹不显示问题解决】
问题描述:为了实现本地物理机与虚拟机之间的文件传输,我们通常采用共享文件夹的方式。但是在Vmware虚拟机使用Ubuntu系统的过程中,由于某种特殊或意外原因,Ubuntu系统或发生/mnt/hgfs共享文件夹丢失不显示的问题。以下是本次问题发…...
C++的相关知识集
1、C概述 1 两大编程思想 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效,简洁,快速和可移植的传统。 2 起源 与c语言一样,c也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼斯特劳斯特卢普)在2…...
解决Jmeter报错 :Error generating the report: java.lang.NullPointerException
当我们在使用命令行的方式来执行jmeter 脚本的时候,例如 ./jmeter -n -t /opt/jmeter/script/test.jmx -Juser50 -Jtime100 -l /opt/jmeter/script/restult2.jtl 上面脚本的含义解释如下: -n -t 通过命令行的方式执行脚本test.jmx -Juser50 并发用户…...
QT外部库:zlib
前言 新建项目:pro文件中新增代码 LIBS -lz 在main.cpp函数中#include "zlib.h",如果此时运行代码提示没有找到对应的函数,那么就qt安装目录:D:\C\qt5.12.7\Tools\mingw730_64\x86_64-w64-mingw32\include(这里是博主…...
钡铼技术BL205模块分布式IO集成应用风电场状态监测
在风力发电这一绿色能源领域,高效、精确的状态监测对于提升风电场运维效率、保障设备安全运行至关重要。随着工业4.0和数字化转型浪潮的推进,传统的监测方式已难以满足日益增长的数据处理与分析需求。钡铼技术BL205模块的出现,为风电场状态监…...
java博客目录
博客目录 基础知识 集合列表 List ArrayList: LinkedList: Set Map TreeMap 设计模式 单例模式: 工厂方法...
从零开始学习Linux(8)----自定义shell
shell从用户读入字符串“ls”,shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序,并等待这个进程结束。所以要写一个shell&…...
《大数据分析-数据仓库项目实战》学习笔记
目录 基本概念 数据仓库 数据仓库整体技术架构 数据仓库主题 数据集市 数据仓库的血缘关系 数据仓库元数据管理 数据仓库的指标 数据仓库维度概念 HDFS Flume Hadoop Kafka 数据仓库分层模型 Superset 即席查询 Sqoop Atlas元数据管理 项目需求描述 系统目标…...
JDK介绍
JDK是Java Development Kit的缩写,是Oracle公司提供的用于开发Java应用程序的开发包。它包括了Java运行环境(Java Runtime Environment),以及一系列Java工具(如javac、java、jdb等)和Java基础类库ÿ…...
JavaScript 对象入门:基础用法全解析
目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…...
如何获得一个Oracle 23ai数据库(docker容器)
准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第3种: Virtual ApplianceRPM安装Docker 我已经有了一台Oracle Linux 8的虚机&#x…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
