操作包括關閉所有、關閉其他、向右關閉、向左關閉
頁面程式碼
<el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
@tab-remove="tabRemove"
@tab-change="clickTab"
>
<el-tab-pane :closable="true" v-for="t in tab" :key="t.path" :name="t.path">
<template #label>
<!--新增滑鼠右鍵開啟下拉框,判斷當前下拉框型別能否刪除-->
<el-dropdown trigger="contextmenu" ref="oneDown" :id="t.path" @click.right="closeDisabled(t.path)"
@visible-change="changeItem($event,t.path)">
{{ t.name }}
<el-icon class="el-icon--right">
<arrow-down/>
</el-icon>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="close('all',t.path)">關閉全部</el-dropdown-item>
<el-dropdown-item :disabled="other" @click="close('other',t.path)">關閉其他</el-dropdown-item>
<el-dropdown-item :disabled="right" @click="close('right',t.path)">向右關閉</el-dropdown-item>
<el-dropdown-item :disabled="left" @click="close('left',t.path)">向左關閉</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-tab-pane>
</el-tabs>
在標籤頁中新增刪除和獲取當前頁面路徑方法,刪除在pinia獲取資料,獲取當前頁面在tab-change會有回撥引數獲取值
let activeName = ref("") function clickTab(tab) { activeName.value = tab } function tabRemove(tabName) { tabs.removeTables(tabName) }
在下拉選單中判斷標籤是否可以進行不同型別刪除
let other = ref() let left = ref() let right = ref() //刪除標籤頁型別是否能使用判斷 function closeDisabled(path) { //當前路徑的下標 let index = tab.value.findIndex(item => item.path === path) //當陣列大於等於2可以刪除其他所有的標籤頁 other.value = !(tab.value.length >= 2) //當前下標在標籤頁的第一個或者大於第一個 left.value = !(index >= 1) //當前下標不能超過標籤頁數量 right.value = !(index + 1 < tab.value.length) }
保持只有一個下拉選單,在開啟其他的頁面將之前的刪除掉
//dom屬性 let oneDown = ref() //保持只有一個下拉框 function changeItem(event, path) { if (!event) { return } //彈框的過程中將其他的關閉 let other = oneDown.value.filter(item => item.id !== path) other.forEach(item => { item.handleClose() }) }
pinia中方法
import {defineStore} from "pinia"; //標籤頁store export const useTables = defineStore('tables', { state: () => { return { tables: [], //展示的標籤頁 nowTab: '' //當前指向標籤頁路徑 } }, actions: { //增加標籤頁 addTables(tab) { //向當前展示標籤頁推資料 this.tables.push(tab) }, // 刪除標籤頁(路徑始終指向前一個標籤頁,除非是第一個標籤頁就會指向第二個) removeTables(nowTab) { //原始陣列下標 const index = this.tables.findIndex(item => item.path === nowTab) //去除需要刪除的標籤頁後 const indexs = this.tables.filter(tab => tab.path !== nowTab) //必須存有一個標籤頁 if (indexs.length >= 1) { this.tables = indexs if (this.tables.length > 0) { //如果刪除的標籤頁在當前,那麼下個指向在新陣列的當前位置 if (index === this.tables.length) { this.nowTab = this.tables[this.tables.length - 1].path } else { //直接進行路徑尋找 this.nowTab = this.tables[index].path } } } }, //關閉標籤頁型別 close(type, path) { //第一次出現下標的地方 const index = this.tables.findIndex(item => item.path === path) //刪除所有標籤頁 if (type === 'all') { this.tables = [] //刪除除當前頁外的其他 } else if (type === 'other') { this.tables = this.tables.filter(item => item.path === path) //刪除右邊所有標籤頁 } else if (type === 'right') { this.tables.splice(index + 1) //刪除左邊所有標籤頁 } else if (type === 'left') { this.tables.splice(0, index) } } }, //持久化本地,防止頁面重新整理丟失 //pinia-plugin-persistedstate外掛 persist: { key: 'tabs', storage: sessionStorage, paths: ['nowTab', 'tables'] } })
全部方法
let tabs = useTables(); //標籤頁展示 let tab = ref([]) //標籤頁路徑 let activeName = ref("") //標籤頁下拉型別 let other = ref() let left = ref() let right = ref() /dom屬性 let oneDown = ref() //監聽pinia中標籤頁和當前標籤頁路徑的變化 watchEffect(() => { tab.value = tabs.tables activeName.value = tabs.nowTab }) //當前標籤頁名稱回撥,修改標籤頁路徑 function clickTab(tab) { activeName.value = tab } //刪除標籤頁型別是否能使用判斷 function closeDisabled(path) { //當前路徑的下標 let index = tab.value.findIndex(item => item.path === path) //當陣列大於等於2可以刪除其他所有的標籤頁 other.value = !(tab.value.length >= 2) //當前下標在標籤頁的第一個或者大於第一個 left.value = !(index >= 1) //當前下標不能超過標籤頁數量 right.value = !(index + 1 < tab.value.length) } //關閉下拉框標籤頁型別 function close(type, path) { tabs.close(type, path) } //刪除標籤頁 function tabRemove(tabName) { tabs.removeTables(tabName) } //保持只有一個下拉框 function changeItem(event, path) { if (!event) { return } //彈框的過程中將其他的關閉 let other = oneDown.value.filter(item => item.id !== path) other.forEach(item => { item.handleClose() }) }