[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)
  }
}
相关推荐
anyup几秒前
uni-app 没有根组件?仅需几行代码实现全局 Toast 和 Modal
前端·架构·uni-app
并不喜欢吃鱼9 分钟前
一.前端web开发:零基础吃透 HTML5 核心知识
前端·html·html5
Hilaku17 分钟前
前端真的比后端简单吗?
前端·javascript·程序员
Canace20 分钟前
为了给视频里的人脸打码,我让 Claude 做了个 Skill
前端·人工智能
zhedream21 分钟前
a-select / a-input 自定义下拉、Vue2 Fragment ,以及 transfer-dom
前端·vue.js
无人生还22 分钟前
从 Vue3 到 React · 快速上手系列第 10 篇:路由
前端·vue.js·react.js
杉氧22 分钟前
跨平台持久化:Flutter 本地数据库的多线程安全与架构设计实践
android·前端·flutter
毅yi25 分钟前
里程碑1:实现elpis-core以及基于elpis-core的基础设置搭建
前端
FogLetter27 分钟前
进程VS线程:你的电脑到底是怎么同时干那么多活的?
前端·面试