elementui實(shí)現(xiàn)標(biāo)簽頁(yè)與菜單欄聯(lián)動(dòng)的示例代碼
技術(shù):vue2+vuex+elementui

store/index.js文件里
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
tabList:[]
},
mutations: {
addTab: (state, tab) => {
// 如果tab已經(jīng)存在,不添加新的tabs
if (state.tabList.some(item => item.path === tab.path)) return
state.tabList.push(tab)
}
},
getters: {
// 獲取tbsList
getTabs: (state) => {
return state.tabList
}
},
actions: {
},
modules: {
}
})
功能點(diǎn):
1:當(dāng)前活躍的tab就是當(dāng)前路由的path
2: 頁(yè)面刷新,tabList數(shù)據(jù)丟失,則在刷新之前使用sessionStorage進(jìn)行存儲(chǔ)
3:刪除tab的時(shí)候,活躍的tab變?yōu)楸粍h除的前一個(gè)或者下一個(gè),刪除后重新設(shè)置活躍的tab 和tabList
4:監(jiān)控路由變化,路由變化了,活躍的tab 和tabList 也要隨之變化
<template>
<el-tabs
v-model="activeTab"
closable
@tab-remove="removeTab"
@tab-click="clickBtn"
>
<el-tab-pane
:key="index"
v-for="(item, index) in tabList"
:label="item.title"
:name="item.path"
>
{{ item.content }}
</el-tab-pane>
</el-tabs>
</template>
<script>
import store from '../../store'
export default {
name: '',
data() {
return {
// 當(dāng)前活躍的tabs
activeTab: '',
}
},
components: {},
computed: {
tabList() {
return store.getters['getTabs']
},
},
watch: {
$route: function () {
this.setActiveTab()
this.addTab()
},
},
created() {},
mounted() {
this.beforeRefresh()
this.setActiveTab()
this.addTab()
},
methods: {
// 設(shè)置活躍的tab
setActiveTab() {
this.activeTab = this.$route.path
},
// 添加tab
addTab() {
const { path, meta } = this.$route
const tab = {
path,
title: meta.title,
}
store.commit('addTab', tab)
},
// 點(diǎn)擊tab
clickBtn(tab) {
const { name } = tab
this.$router.push({ path: name })
},
// 刪除tab
removeTab(target) {
// 當(dāng)前激活的tab
let active = this.activeTab
const tabs = this.tabList
// 只有一個(gè)標(biāo)簽頁(yè)的時(shí)候不允許刪除
if (tabs.length === 1) return
if (active === target) {
tabs.forEach((tab, index) => {
// 如果刪除的就是當(dāng)前活躍的tab,就把活躍的tab變成上一個(gè)或下一個(gè)
const nextTab = tab[index + 1] || tab[index - 1]
if (nextTab) {
active = nextTab.path
}
})
}
// 重新設(shè)置當(dāng)前激活的選項(xiàng)卡和 選項(xiàng)卡列表
this.activeTab = active
store.state.tabList = tabs.filter((tab) => tab.path !== target)
},
// 解決刷新數(shù)據(jù)丟失問(wèn)題
beforeRefresh() {
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('tabsView', JSON.stringify(this.tabList))
})
let tabSession = sessionStorage.getItem('tabsView')
if (tabSession) {
let oldTabs = JSON.parse(tabSession)
if (oldTabs.length > 0) {
store.state.tabList = oldTabs
}
}
},
},
}
</script>
補(bǔ)充:路由
{
path: '/layout',
component: () => import('../layout/index.vue'),
children: [
{
path: 'lay1',
component: () => import('../views/lay/Lay1.vue'),
meta: {
title:'選項(xiàng)1'
}
},
{
path: 'lay2',
component: () => import('../views/lay/Lay2.vue'),
meta: {
title:'選項(xiàng)2'
}
},
{
path: 'lay3',
component: () => import('../views/lay/Lay3.vue'),
meta: {
title:'選項(xiàng)3'
}
},
{
path: 'lay4',
component: () => import('../views/lay/Lay4.vue'),
meta: {
title:'選項(xiàng)4'
}
},
}到此這篇關(guān)于elementui實(shí)現(xiàn)標(biāo)簽頁(yè)與菜單欄聯(lián)動(dòng)的示例代碼的文章就介紹到這了,更多相關(guān)element 標(biāo)簽頁(yè)與菜單欄聯(lián)動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Vue、element-ui、axios實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
- vue elementUI使用tabs與導(dǎo)航欄聯(lián)動(dòng)
- 詳解element-ui級(jí)聯(lián)菜單(城市三級(jí)聯(lián)動(dòng)菜單)和回顯問(wèn)題
- vue + elementUI實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)的方法示例
- element實(shí)現(xiàn)二級(jí)菜單和頂部導(dǎo)航聯(lián)動(dòng)的示例
- vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)
- 利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的詳細(xì)過(guò)程
- ElementUI中兩個(gè)Select選擇聯(lián)動(dòng)效果實(shí)現(xiàn)方法
相關(guān)文章
vue.js框架實(shí)現(xiàn)表單排序和分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了vue.js框架實(shí)現(xiàn)表單排序和分頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Vue3實(shí)現(xiàn)拖拽圖片四角調(diào)整圖片大小的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Vue3實(shí)現(xiàn)拖拽圖片四角調(diào)整圖片大小的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
vue給input file綁定函數(shù)獲取當(dāng)前上傳的對(duì)象完美實(shí)現(xiàn)方法
這篇文章主要介紹了vue給input file綁定函數(shù)獲取當(dāng)前上傳的對(duì)象完美實(shí)現(xiàn)方法,需要的朋友可以參考下2017-12-12
Vue使用axios進(jìn)行數(shù)據(jù)異步交互的方法
大家都知道在Vue里面有兩種出名的插件能夠支持發(fā)起異步數(shù)據(jù)傳輸和接口交互,分別是axios和vue-resource,同時(shí)vue更新到2.0之后,宣告不再對(duì)vue-resource更新,而是推薦的axios,今天就講一下怎么引入axios,需要的朋友可以參考下2024-01-01
vue+elementUI的select下拉框回顯為數(shù)字問(wèn)題
這篇文章主要介紹了vue+elementUI的select下拉框回顯為數(shù)字問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Vue3路由跳轉(zhuǎn)并傳遞參數(shù)的應(yīng)用場(chǎng)景分析
本文主要介紹在Vue3工程使用setup語(yǔ)法中如何進(jìn)行路由跳轉(zhuǎn)并傳遞參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-05-05
vue3+elementplus基于el-table-v2封裝公用table組件詳細(xì)代碼
在日常開(kāi)發(fā)后端管理系統(tǒng)項(xiàng)目中,用于展示數(shù)據(jù)多會(huì)用表格進(jìn)行展示,下面這篇文章主要給大家介紹了關(guān)于vue3+elementplus基于el-table-v2封裝公用table組件的相關(guān)資料,需要的朋友可以參考下2023-12-12
element使用自定義icon圖標(biāo)的兩種解決方式
因?yàn)榘惭b原型圖設(shè)計(jì)實(shí)現(xiàn)頁(yè)面,在element自帶的圖標(biāo)庫(kù)好像沒(méi)有,所以按鈕的圖標(biāo)icon需要自定義,下面這篇文章主要給大家介紹了關(guān)于element使用自定義icon圖標(biāo)的兩種解決方式,需要的朋友可以參考下2022-07-07

