Vue實現側邊導航欄於Tab頁關聯的示例代碼
技術棧
- 側邊欄用
- Antdtab使用element
效果
<template> <div class="main-card"> <el-row> <el-col :span="3"> <div class="menu-all"> <div class="menu-head"> <span class="menu-head-title">倉庫管理</span>/<span class="menu-head-title" @click="goBack" >大屏</span > </div> <!-- <div class="menu-body"> <div class="menu-item" @click="openTabs(item)" v-for="item in menuItems" :key="item"> <i class="el-icon-s-home" v-if="item.value === '01'"></i>{{ item.name }} </div> </div> --> <a-menu mode="inline" theme="dark" :openKeys="openKeys" v-model="SelectedKeys" @openChange="onOpenChange" > <a-sub-menu v-for="item in menuItems" :key="item.value"> <span slot="title" ><a-icon type="appstore" /><span>{{ item.name }}</span></span > <a-menu-item v-for="childrenItem in item.children" :key="childrenItem.value" @click="addTabs(childrenItem)" >{{ childrenItem.name }} </a-menu-item> </a-sub-menu> </a-menu> </div> </el-col> <el-col :span="21"> <el-row> <el-col :span="24"> <div> <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab"> <el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title" :name="item.name"> <component :is="item.content"></component> </el-tab-pane> </el-tabs> </div> </el-col> </el-row> </el-col> </el-row> </div> </template> <script> export default { data(){ return{ openKeys: [],//控制一級菜單折疊展開的數組 存放一級菜單的value SelectedKeys: '',//控制二級菜單高亮 存放二級菜單value //側邊導航菜單數組 menuItems: [ { name: '應入應出報表', value: '0', children: [ { name: '應入庫單量報表', value: '01', content: () => import('@/views/main/index/qtyReportIndex.vue'), }, { name: '應入庫臺數報表', value: '02', content: () => import('@/views/main/index/qtyReportIndexQty.vue'), }, { name: '應出庫單量報表', value: '03', content: () => import('@/views/main/index/handoverReportIndex.vue'), }, { name: '應出庫臺數報表', value: '04', content: () => import('@/views/main/index/handoverReportIndexQty.vue'), }, ], }, { name: '預測', value: '1', children: [ { name: '到貨登記', value: '11', content: () => import('@/views/main/index/asnHdrDockIndex.vue'), }, { name: '倉庫利用率', value: '12', content: () => import('@/views/main/index/whUteIndex.vue'), }, { name: '庫內庫存', value: '13', content: () => import('@/views/main/index/imOdsStorageIndex.vue'), }, ], }, { name: '指標', value: '2', children: [ { name: '單倉提貨率', value: '201', content: () => import('@/views/main/index/singleWhDeliveryScaleIndex.vue'), }, { name: '中轉在庫時長', value: '202', content: () => import('@/views/main/index/transitDurationInWhIndex.vue'), }, { name: '重復SN', value: '203', content: () => import('@/views/main/index/dwExceptionBarcodeIndex.vue'), }, { name: '盤點日清單', value: '204', content: () => import('@/views/main/index/inventoryRqIndex.vue'), }, { name: '移庫指標監控', value: '205', content: () => import('@/views/main/index/transferIndexIndex.vue'), }, { name: '揀貨庫位分析匯總報表', value: '206', content: () => import('@/views/main/index/pickingByLocSumIndex.vue'), }, { name: '裝車報表匯總', value: '207', content: () => import('@/views/main/index/loadingSummaryIndex.vue'), }, { name: '出庫SN報錯率', value: '208', content: () => import('@/views/main/index/dwBarcodeErrorRptIndex.vue'), }, { name: '揀貨庫位分析明細', value: '209', content: () => import('@/views/main/index/dwPickFxmxIndex.vue'), }, { name: '不按批次揀貨庫區維度', value: '210', content: () => import('@/views/main/index/notPickingByBatchIndex.vue'), }, ], }, ], editableTabsValue: '',//tab頁當前active的item editableTabs: [],//tab頁數組 } }, methods:{ // 用於其他頁面跳轉來到主頁並打開tab頁的方法 // goTable(item) { // this.openKeys = [item.value.substring(0, 1)] // this.SelectedKeys = item.value // this.$store.commit('updateHomeOrIndexSwitch', false) // this.openTabs(item) //}, addTab(item) { let onOff = false; this.editableTabs.forEach((x) => { if (x.name == item.name) { this.editableTabsValue = item.name onOff=true return; } }) if(!onOff){ this.editableTabs.push({ title: item.name, name: item.name, content: item.content, }) this.editableTabsValue = item.name } }, //關閉tab頁觸發 targetName = item.name removeTab(targetName) { let tabs = this.editableTabs let activeName = this.editableTabsValue if (activeName === targetName) { tabs.forEach((tab, index) => { if (tab.name === targetName) { let nextTab = tabs[index + 1] || tabs[index - 1] if (nextTab) { activeName = nextTab.name } else { this.openKeys = [] this.SelectedKeys = '' } } }) } this.editableTabsValue = activeName this.editableTabs = tabs.filter((tab) => tab.name !== targetName) }, }, watch:{ editableTabsValue(val) { this.menuItems.forEach((menuItem) => { if (menuItem.children) { menuItem.children.forEach((childrenItem) => { if (childrenItem.name === val) { this.openKeys = [childrenItem.value.substring(0, 1)] this.SelectedKeys = childrenItem.value return } }) } }) }, } } </script>
分析
這一套組件不能單憑element一個單一框架實現,側邊導航欄我們需要控制折疊,控制高亮,以及菜單組三個參數,而element的導航菜單控制折疊展開菜單組的參數是一個函數@open控制,所以我們沒有辦法通過代碼去控制某個菜單組的展開收起所以跨框架做瞭這麼一個功能 記錄一下
到此這篇關於Vue實現側邊導航欄於Tab頁關聯的示例代碼的文章就介紹到這瞭,更多相關Vue 側邊導航欄於Tab頁關聯內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue實現tab標簽(標簽超出自動滾動)
- 使用Vue3進行數據綁定及顯示列表數據
- vue單選按鈕,選中如何改變其當前按鈕顏色
- vue實現el-menu和el-tab聯動的示例代碼
- vue選項卡組件的實現方法