vue3+ts项目实现动态增减标签页跳转相应页面

时间: 2023-08-22 21:06:04 浏览: 59
好的,下面我来讲一下如何在 Vue3 + TypeScript 项目中实现动态增减标签页并跳转到相应页面的操作。 首先,在 Vue3 中实现动态标签页与上面的回答类似,需要创建一个 `tabs` 数组来存储标签页信息,并使用动态组件来加载对应的页面组件。 不过,在 TypeScript 中,我们需要对 `tabs` 数组进行类型定义。我们可以定义一个 `Tab` 接口来描述标签页的结构: ```typescript interface Tab { title: string; path: string; component: any; // 动态组件类型为 any } ``` 其中,`title` 表示标签页的标题,`path` 表示标签页跳转的路由路径,`component` 表示对应的页面组件,由于是动态加载的组件,因此类型为 `any`。 接着,在 Vue 组件中,我们需要使用 `ref` 来创建 `tabs` 和 `currentTab` 变量,并对其进行类型定义: ```typescript import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'Tabs', setup() { const tabs = ref<Tab[]>([]); const currentTab = ref<Tab>(); // ... }, }); ``` 在此示例中,我们使用了泛型 `Tab[]` 来对 `tabs` 数组进行类型定义,并使用 `Tab` 对象对 `currentTab` 进行类型定义。 接下来,我们需要实现标签页增加、删除和跳转的逻辑。这里我们可以定义以下方法: ```typescript const addTab = (tab: Tab) => { const index = tabs.value.findIndex((item) => item.path === tab.path); if (index === -1) { tabs.value.push(tab); currentTab.value = tab; } else { currentTab.value = tabs.value[index]; } }; const removeTab = (tab: Tab) => { const index = tabs.value.findIndex((item) => item.path === tab.path); if (index !== -1) { tabs.value.splice(index, 1); if (currentTab.value === tab) { currentTab.value = tabs.value[index] || tabs.value[index - 1]; } } }; const switchTab = (tab: Tab) => { currentTab.value = tab; }; ``` 其中,`addTab` 方法用于增加一个标签页,如果 `tabs` 数组中不存在对应的标签页,则新增一个标签页,并将 `currentTab` 设置为新增的标签页;否则直接将 `currentTab` 设置为已存在的标签页。 `removeTab` 方法用于删除一个标签页,如果 `tabs` 数组中存在对应的标签页,则从 `tabs` 数组中移除该标签页,并将 `currentTab` 设置为上一个或下一个标签页(如果当前标签页是第一个或最后一个标签页,则将 `currentTab` 设置为上一个或下一个标签页,否则将 `currentTab` 设置为第一个标签页)。 `switchTab` 方法用于切换到指定的标签页,将 `currentTab` 设置为指定的标签页。 最后,在模板中,我们可以使用 `v-for` 循环渲染 `tabs` 数组,并使用 `router-link` 实现标签页跳转: ```html <template> <div class="tabs"> <ul> <li v-for="tab in tabs" :key="tab.path" :class="{ active: currentTab === tab }"> <router-link :to="tab.path" exact @click.native="switchTab(tab)">{{ tab.title }}</router-link> <span class="close" @click="removeTab(tab)">x</span> </li> </ul> <router-view /> </div> </template> ``` 在此模板中,我们使用 `v-for` 循环渲染 `tabs` 数组,并使用 `router-link` 实现标签页跳转。在点击 `router-link` 时,我们调用 `switchTab` 方法切换到对应的标签页,并设置 `router-link` 的 `exact` 属性,使得在当前标签页时,`router-link` 也能被激活。 完整的代码如下: ```typescript <template> <div class="tabs"> <ul> <li v-for="tab in tabs" :key="tab.path" :class="{ active: currentTab === tab }"> <router-link :to="tab.path" exact @click.native="switchTab(tab)">{{ tab.title }}</router-link> <span class="close" @click="removeTab(tab)">x</span> </li> </ul> <router-view /> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; import { RouteRecordRaw, useRoute, useRouter } from 'vue-router'; interface Tab { title: string; path: string; component: any; } export default defineComponent({ name: 'Tabs', setup() { const tabs = ref<Tab[]>([]); const currentTab = ref<Tab>(); const route = useRoute(); const router = useRouter(); const addTab = (tab: Tab) => { const index = tabs.value.findIndex((item) => item.path === tab.path); if (index === -1) { tabs.value.push(tab); currentTab.value = tab; } else { currentTab.value = tabs.value[index]; } }; const removeTab = (tab: Tab) => { const index = tabs.value.findIndex((item) => item.path === tab.path); if (index !== -1) { tabs.value.splice(index, 1); if (currentTab.value === tab) { currentTab.value = tabs.value[index] || tabs.value[index - 1]; } } }; const switchTab = (tab: Tab) => { currentTab.value = tab; router.push(tab.path); }; const findTabByPath = (path: string) => { return tabs.value.find((tab) => tab.path === path); }; const createRouteTabs = (routes: RouteRecordRaw[]) => { routes.forEach((route) => { if (route.meta?.showInTabs) { addTab({ title: route.meta.title || route.name || '', path: route.path, component: route.component || {}, }); } if (route.children) { createRouteTabs(route.children); } }); }; createRouteTabs(router.getRoutes()); const created = () => { const tab = findTabByPath(route.path); if (tab) { currentTab.value = tab; } else { const { meta, name, path, component } = route; addTab({ title: meta.title || name || '', path, component: component || {}, }); } }; return { tabs, currentTab, addTab, removeTab, switchTab, created, }; }, }); </script> ``` 在此示例中,我们还使用了 `useRoute` 和 `useRouter` 钩子来获取当前路由信息和路由实例,从而实现了在页面刷新时恢复标签页状态的功能。同时,我们也通过 `meta` 字段来标记哪些路由需要在标签页中显示。

相关推荐

最新推荐

recommend-type

vue页面跳转实现页面缓存操作

打野在A页面野区进行一波骚操作打了一只蓝爸爸,然后点击导航栏跑到B页面的野区秀操作打了一只红爸爸,然后他又回到A野区,希望A野区还是只有一只蓝爸爸被打的状态,其他野没被偷 第一步 在路由里面设置需要缓存的...
recommend-type

vue+ts下对axios的封装实现

主要介绍了vue+ts下对axios的封装实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Vue拖拽组件列表实现动态页面配置功能

主要介绍了Vue拖拽组件列表实现动态页面配置功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

vue-router实现tab标签页(单页面)详解

主要为大家详细介绍了vue-router实现tab标签页的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

vue页面跳转后返回原页面初始位置方法

vue页面跳转到新页面之后,再由新页面返回到原页面时候若想返回调出原页面的初始位置,怎么来解决这个问题呢?首先我们应该在跳出页面时候记录下跳出的scrollY,返回原页面的时候在设置返回位置为记录下的scrolly...
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。