[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)
  }
}
相关推荐
Highcharts.js19 小时前
常见报错排雷指南3:兼容性问题的官方解法
前端·javascript·react.js·可视化·highcharts·报错解法
雪芽蓝域zzs19 小时前
第三十六节:keep-alive 页面缓存(Vue3 + 后台管理系统)
前端·vue.js·缓存
言乐619 小时前
Python加速器2视频网页加速器
前端·javascript·css·python·音视频
边境悍匪19 小时前
蜗牛学苑 Java 智能体学习 Day41|ElementPlus 布局、Vue‑Router 登录、Axios 思维导图复盘
java·vue.js·学习
IT_陈寒19 小时前
为什么我的Java Stream操作总是默默吃掉异常?
前端·人工智能·后端
志尊宝19 小时前
Vue3 零基础每日笔记(017):事件处理进阶——$event、多事件与事件修饰符全家桶
javascript·vue.js·笔记
光影少年19 小时前
react navite浏览器 Event Loop 和 Node Event Loop 的区别
前端·javascript·react native·react.js·前端框架
90后的晨仔20 小时前
uni-app 安卓自有证书完全指南
前端
CharlesYu011 天前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端