[element-plus] el-tabs和el-menu联动

html 复制代码
  <el-container>
    <el-aside width="200px">
      <el-menu :default-active="activeTab" @select="handleMenuSelect">
        <el-menu-item index="/dashboard">仪表盘</el-menu-item>
        <el-menu-item index="/system">系统管理</el-menu-item>
      </el-menu>
    </el-aside>
    
    <el-container>
      <el-header>
        <el-tabs v-model="activeTab" @tab-click="handleTabClick" closable @tab-remove="removeTab">
          <el-tab-pane 
            v-for="tab in openedTabs" 
            :key="tab.path"
            :label="tab.title" 
            :name="tab.path"
          />
        </el-tabs>
      </el-header>
      
      <el-main>
        <router-view />
      </el-main>
    </el-container>
  </el-container>
typescript 复制代码
const activeTab = ref(route.path)

// 已打开的 Tabs
const openedTabs = ref([
  { path: '/dashboard', title: '仪表盘' }
])

// 菜单标题映射(可从路由 meta 获取)
const getTitle = (path) => {
  const map = { '/dashboard': '仪表盘', '/system': '系统管理' }
  return map[path] || path
}

// 监听路由变化
watch(
() => route.path, 
(newPath) => {
  activeTab.value = newPath
  if (!openedTabs.value.find(t => t.path === newPath)) {
    openedTabs.value.push({ path: newPath, title: getTitle(newPath) })
  }
}, 
{ immediate: true }
)

// 菜单点击
const handleMenuSelect = (path) => {
  router.push(path)
}

// Tab 点击
const handleTabClick = (tab) => {
  router.push(tab.props.name)
}

// 关闭 Tab
const removeTab = (path) => {
  const index = openedTabs.value.findIndex(t => t.path === path)
  if (index === -1) return
  openedTabs.value.splice(index, 1)
  if (path === activeTab.value && openedTabs.value.length > 0) {
    router.push(openedTabs.value[openedTabs.value.length - 1].path)
  }
}
相关推荐
小呀小叮当~1 小时前
Telegram 有哪些实用功能?一文了解
前端·人工智能·后端·其它
索西引擎2 小时前
【React】React Fiber 架构:设计动机、核心机制与调度策略分析
前端·react.js·架构
雨季mo浅忆2 小时前
上传文件夹
前端·vue3
谙忆10242 小时前
响应式图片实战:srcset、sizes、picture 与 art direction 到底怎么用
前端
索西引擎4 小时前
【React】JSX:JavaScript 语法扩展的本质、编译机制与表达能力分析
前端·javascript·react.js
国科安芯12 小时前
航天电子模拟前端三大支柱:精密运放、高速运放与电压监控的协同设计方法——ASL8522S/ASL622S/ASL706S技术解析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
牧濑红莉12 小时前
网络安全竞赛pwn全解及第一道ai的wp
javascript·.net
神明不懂浪漫13 小时前
【第四章】CSS(二)——文本外观属性与复合选择器
前端·css·经验分享·笔记
kyriewen13 小时前
别再用AI debug了——这5种bug越修越烂
前端·javascript·ai编程