1 store 设置 。
export type ItabItem = {
name:string,
title:string
}
export interface iTabState {
tabsList:Array<ItabItem>
}
export const tabStore = {
namespaced: true,
state:{
tabsList:[]
},
mutations:{
addTab(state:iTabState, tab:ItabItem) {
const isSome = state.tabsList.some((item) => item.name == tab.name)
if(!isSome) {
state.tabsList.push(tab)
}
},
closeCurrentTab(state:iTabState,targetName:string) {
const index = state.tabsList.findIndex((item)=> item.name == targetName)
state.tabsList.splice(index,1)
},
},
getters:{
getTabs(state:iTabState) {
return state.tabsList
}
}
}
2 TabBar.vue
2.1 模版 。
<template>
<el-tabs
v-model="activeKey"
type="card"
closable
@tab-click="clickHandle"
@tab-remove="removeTab"
>
<el-tab-pane
v-for="item in tabs"
:key="item.name"
:label="item.title"
:name="item.name"
>
{{ item.content }}
</el-tab-pane>
</el-tabs>
</template>
2.2 js脚本。.
<script lang="ts" setup>
import { onMounted, ref, watch } from 'vue'
import { useStore } from '@/store';
import { computed } from '@vue/reactivity';
import {useRoute, useRouter} from 'vue-router'
const route = useRoute()
const router = useRouter();
const store = useStore();
console.log('@', store)
const addTab =()=>{
store.commit(
'tabStore/addTab',
{
name:route.name,
title:route.meta?.title
}
)
}
const tabs = computed(()=>{
return store.getters['tabStore/getTabs']
})
const activeKey = ref<string>('')
watch(()=>route.name,(to)=>{
activeKey.value = route.name;
addTab();
})
const clickHandle = (event:any) =>{
console.log('###',event.props);
router.push({name:event.props.name})
}
2.3 。. (支持刷新,)
const refresh = () => {
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('TABS_ROUTES', JSON.stringify(tabs.value))
})
let session = sessionStorage.getItem('TABS_ROUTES')
if (session) {
let tabItem = JSON.parse(session)
tabItem.forEach((tab) => {
store.commit('tabStore/addTab', tab)
})
}
activeKey.value = route.name;
}
onMounted(() => {
refresh()
})
2.4 删除tab
const removeTab = (targetName: string) => {
console.log(targetName)
if (tabs.value.length === 1) {
return alert('这已经是最后一页!')
}
if (activeKey.value === targetName) {
tabs.value.forEach((tab, index: number) => {
if (tab.path === targetName) {
const nextTab = tabs.value[index + 1] || tabs.value[index - 1]
if (nextTab) {
activeKey.value = nextTab.name
}
}
})
}
store.commit('tabStore/closeCurrentTab', targetName)
}
