vue 循环tabs 标签页 组件_vue2.0 + elementUi 实现无限tab式页面

本文介绍了如何利用ElementUI的tabs组件和Vuex管理状态,实现无限tabs式页面。通过菜单点击或按钮操作,动态生成并管理tab标签,包括关闭和刷新功能。同时,文章提到了在实现三级混合菜单时遇到的问题及解决方案,并分享了如何将这些功能全局化,以便在项目中复用。
摘要由CSDN通过智能技术生成

使用elementUi的tabs组件 + vuex 实现点击菜单或者点击按钮新增一个tab标签页

一、思路

由于之前一直做的单页面项目都是使用路由控制实现的路由改变销毁原有组件加载新组件的方式,是view区域始终只有一个路由的方式实现单页面的管理系统,后面接到一个新的项目后发现原来的逻辑对于新需求不太适应,首先新的需求要求,打开的页面或者类页面的tab标签页数量上可能是无限的,这样对于使用路由逻辑上就不太好实现,比如我现在需要打开N个订单详情,路由控制的方式就比较麻烦了,虽然可以用keep-alive 标签来控制和保存参数,但是各个页面之间的交互以及菜单与tab方面的切换,还有国际化做起来就比较麻烦。后面就想到使用elementUi的tabs组件和vuex来做,因为tabs组件效果上看上去和浏览器的新标签打开页面效果比较相似,这样可以减少很多交互效果的css和js书写,不过这个组件也有很多坑(具体后面再说)

1.产品想要的效果

image

首先点击一个菜单项生成一个tab页面,其他的页面或者组件也能通过点击生成tabs 相同的组件但是除菜单的不可以重复外其他入口的是可以无限打开的,比如订单详情

image

点击x的时候关闭当前页面,点击刷新标识的时候刷新当前页面的数据。

2 菜单效果

image

菜单实现分为三级菜单、一、二级 为展开式菜单,三级菜单为弹出式菜单(这个菜单踩了不少坑)因为这个项目是一开始就确定使用elementUi来做的,这次是属于重构所以优先考虑的是使用elementUi自带的组件来实现这个效果,但是这个效果显然 没有现成的 elementUi的API上只有全展开或者全弹出式的菜单没有这种混合的,后面是做其他业务模块的时候使用到了Popover弹出 组件 于是来了灵感使用 于是使用 NavMenu + Popover 的方式实现了这种混合菜单。

上干货:

el-menu

:unique-opened="true"

class="el-menu_nav"

collapse-transition

:collapse="isCollapse"

:default-active="activeTabName"

@select="addTab">

:index="item.index"

:key="index"

v-if="!item.children"

v-for="(item,index) in navList"

>

{ {item.title}}

background-color="#fff"

:index="item.index"

:key="index"

v-if="item.children"

v-for="(item,index) in

好的,我知道你想问什么。首先,我们需要创建一个 Tabs 组件,并且在组件中使用 v-for 循环来渲染标签。以下是一个简单的示例代码: ```html <template> <div class="tabs"> <div class="tab" v-for="(tab, index) in tabs" :key="index" :class="{ 'active': activeTab === index }" @click="activeTab = index"> {{ tab.label }} </div> <div class="tab-content"> <slot :name="tabs[activeTab].label"></slot> </div> </div> </template> <script> export default { name: 'Tabs', data() { return { activeTab: 0, tabs: [ { label: 'Tab 1' }, { label: 'Tab 2' }, { label: 'Tab 3' } ] } } } </script> <style> .tabs { display: flex; flex-direction: column; } .tab { cursor: pointer; padding: 10px; border: 1px solid #ccc; border-bottom: none; } .tab.active { background-color: #ccc; } .tab-content { border: 1px solid #ccc; padding: 10px; } </style> ``` 在上面的示例中,我们使用了一个名为 tabs 的数组来存储每个标签的信息。我们使用 v-for 循环来渲染每个标签标签,并且使用 activeTab 变量来追踪当前选中的标签。当用户单击标签时,我们将更新 activeTab 变量,并使用插槽来渲染相应的标签内容。 如果你想根据不同的标签来显示不同的表格内容,你可以在插槽中使用 v-if 或者 v-show 来判断应该显示哪个表格。例如: ```html <template> <div class="tabs"> <div class="tab" v-for="(tab, index) in tabs" :key="index" :class="{ 'active': activeTab === index }" @click="activeTab = index"> {{ tab.label }} </div> <div class="tab-content"> <table v-if="tabs[activeTab].label === 'Tab 1'"> <!-- 表格 1 的内容 --> </table> <table v-else-if="tabs[activeTab].label === 'Tab 2'"> <!-- 表格 2 的内容 --> </table> <table v-else-if="tabs[activeTab].label === 'Tab 3'"> <!-- 表格 3 的内容 --> </table> </div> </div> </template> ``` 在上面的示例中,我们使用了 v-if 和 v-else-if 来判断当前选中的标签是哪个,并根据不同的标签显示不同的表格内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值