You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vuetify Tabs组件中正确添加二级子标签实现嵌套菜单

问题根因

你的用法不符合Vuetify Tabs组件的设计规范,属于组件选型不匹配:

  • v-tab仅作为标签项的触发容器,内部不支持嵌套另一组v-tabs组件,强行嵌套会直接导致布局错乱
  • Tabs组件本身定位是平级内容的切换,原生不支持多级嵌套菜单的交互逻辑

你遇到的错误效果如下:
错误效果示意图

最优解决方案:改用v-list实现多级侧边导航

垂直场景的多级菜单用Vuetify原生的v-list组件实现,天然支持嵌套展开、样式规范,配合动态内容渲染即可完全匹配你的需求,示例代码如下:

<template>
  <v-container v-if="userLoaded" fluid>
    <v-row>
      <!-- 侧边多级导航区 -->
      <v-col cols="3">
        <v-list density="compact" nav>
          <template v-for="tab in tabs" :key="tab.title">
            <!-- 无子菜单的一级导航 -->
            <v-list-item
              v-if="!tab.subtabs || !tab.subtabs.length"
              :value="tab.title"
              @click="activeTab = tab.title"
            >
              <v-list-item-title>{{ tab.title }}</v-list-item-title>
            </v-list-item>
            <!-- 有子菜单的一级导航,可展开 -->
            <v-list-group v-else :value="tab.title" prepend-icon="" >
              <template v-slot:activator="{ props }">
                <v-list-item v-bind="props">
                  <v-list-item-title>{{ tab.title }}</v-list-item-title>
                </v-list-item>
              </template>
              <v-list-item
                v-for="(subtab, index) in tab.subtabs"
                :key="index"
                :value="`${tab.title}-${subtab.title}`"
                @click="activeTab = `${tab.title}-${subtab.title}`"
                class="pl-8"
              >
                <v-list-item-title>{{ subtab.title }}</v-list-item-title>
              </v-list-item>
            </v-list-group>
          </template>
        </v-list>
      </v-col>
      <!-- 右侧内容展示区 -->
      <v-col cols="9">
        <profile v-if="activeTab === 'Profile' || activeTab.startsWith('Profile-')" @updateloader="updateLoader" />
        <finance v-if="activeTab === 'Finance'" :user="user" :loading="loading" @updateloader="updateLoader" />
        <h1 v-if="activeTab === 'Inventory'">Inventory goes here</h1>
        <notifications v-if="activeTab === 'Notifications'" />
        <workgroup v-if="activeTab === 'WorkGroup'" />
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
import Profile from './children/profile.vue';
import Finance from './children/finance.vue';
import Notifications from './children/notifications.vue';
import Workgroup from './children/workgroup.vue';

export default {
  name: 'Settings',
  components: { Profile, Finance, Notifications, Workgroup },
  data() {
    return {
      activeTab: 'Profile', // 默认选中项
      tabs: [{ title: 'Profile', subtabs: [{ title: 'one' }, { title: 'two' }] }, { title: 'Finance' }, { title: 'Inventory' }, { title: 'Notifications' }, { title: 'WorkGroup' }],
      // 其他原有数据
    }
  },
  // 其他原有方法
}
</script>

可选方案:强制用Tabs实现的调整方法

如果一定要保留Tabs组件的交互,需要把嵌套的子tabs移到外层v-tabs的同级,不要放在v-tab内部,给子标签添加左侧缩进样式区分层级,缺点是无法实现折叠收起的交互,扩展性差。

内容的提问来源于stack exchange,提问作者Riza Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:54:05