vue3中如何实现导航栏目下再一个导航栏?

image.png
如图所示,实现如上效果,要采用那种标签实现?
我采用的实element plus 我想到是el-tabs但是上面已经有一个了,在使用一个的话页面打开速度很慢,如果采用segmented是否可行?
注:头部导航我采用的是el-tabes这个标签

阅读 498
avatarAI BotBETA
在 Vue 3 中,如果你希望在已有的导航栏目下再添加一个导航栏,可以考虑使用 `el-submenu` 组件(如果你使用的是 Element Plus 库)来实现嵌套菜单的效果。对于你提供的图片效果,使用 `el-submenu` 是比较合适的解决方案,因为它允许你在一个菜单项下再包含子菜单。

使用 `el-segmented` 组件(如果 Element Plus 提供了这样的组件,并且它符合你的需求)也可以是一种选择,但它通常用于不同的场景,比如选择一组互斥的选项。对于层级结构的导航,`el-submenu` 更符合常见的 UI 设计模式。

这里是一个使用 `el-submenu` 的简单示例:

<template>
<el-menu

default-active="1"
class="el-menu-vertical-demo"
@open="handleOpen"
@close="handleClose"
:collapse="isCollapse"
<el-submenu index="1">
  <template slot="title"><i class="el-icon-location"></i>导航一</template>
  <el-menu-item-group>
    <template slot="title">分组一</template>
    <el-menu-item index="1-1">选项1</el-menu-item>
    <el-menu-item index="1-2">选项2</el-menu-item>
  </el-menu-item-group>
  <el-submenu index="1-3">
    <template slot="title">选项3</template>
    <el-menu-item index="1-3-1">选项3-1</el-menu-item>
  </el-submenu>
</el-submenu>
<el-menu-item index="2">
  <i class="el-icon-menu"></i>
  <span slot="title">导航二</span>
</el-menu-item>
<el-menu-item index="3">
  <i class="el-icon-document"></i>
  <span slot="title">导航三</span>
</el-menu-item>
<el-menu-item index="4">
  <i class="el-icon-setting"></i>
  <span slot="title">导航四</span>
</el-menu-item>

</el-menu>
</template>

<script>
export default {
data() {

return {
  isCollapse: false,
};

},
methods: {

handleOpen(key, keyPath) {
  console.log(key, keyPath);
},
handleClose(key, keyPath) {
  console.log(key, keyPath);
},

},
};
</script>

<style scoped>
.el-menu-vertical-demo {
width: 200px;
min-height: 400px;
border-right: none;
}
</style>


在这个示例中,`el-submenu` 组件被用来创建一个包含子菜单的导航项。你可以在 `el-submenu` 内部添加更多的 `el-menu-item` 或 `el-submenu` 来实现更复杂的层级结构。

如果你确实遇到了页面打开速度慢的问题,可能是由于其他原因导致的,比如组件库版本不兼容、大量数据渲染、或者复杂的计算逻辑等。优化这些问题可能需要进一步的代码审查和优化策略。
1 个回答

复杂导航:
使用 el-menu 和 el-submenu 提供更好的导航体验,适合复杂的多级菜单结构。
模块切换:
使用 el-tabs 提供直观的选项卡导航,适合展示大量内容或复杂结构。
选项较少:
使用 el-segmented 提供快速的选项切换体验,适合简单内容展示。

补充

el-tabs下面使用el-segmented时候页面打开很慢,而且页面变成空白处理

情况 1: 初始渲染问题

描述:当 el-tabs 包含大量内容或复杂组件时,初始渲染可能会导致页面加载缓慢。默认情况下,el-tabs 会同时渲染所有选项卡的内容,这会增加页面的初始加载时间。

解决方案:使用 lazy 属性按需加载选项卡内容,避免一次性渲染所有内容,从而提升页面加载速度。

<template>
  <el-tabs v-model="activeTab" type="card" lazy>
    <el-tab-pane label="Tab 1" name="1">
      <el-segmented v-model="activeSegment" :options="segmentOptions1" />
      <div v-if="activeSegment === '1-1'">内容 1-1</div>
      <div v-if="activeSegment === '1-2'">内容 1-2</div>
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="2">
      <el-segmented v-model="activeSegment" :options="segmentOptions2" />
      <div v-if="activeSegment === '2-1'">内容 2-1</div>
      <div v-if="activeSegment === '2-2'">内容 2-2</div>
    </el-tab-pane>
  </el-tabs>
</template>

<script>
export default {
  data() {
    return {
      activeTab: '1',
      activeSegment: '1-1',
      segmentOptions1: [
        { label: '二级菜单 1-1', value: '1-1' },
        { label: '二级菜单 1-2', value: '1-2' },
      ],
      segmentOptions2: [
        { label: '二级菜单 2-1', value: '2-1' },
        { label: '二级菜单 2-2', value: '2-2' },
      ],
    };
  },
};
</script>

情况 2: 数据加载问题

描述:如果 el-segmented 组件依赖于异步数据加载,而这些数据在选项卡切换时还未加载完成,可能会导致内容为空。

解决方案:延迟加载数据,确保在选项卡切换时,数据已经加载完成。可以在选项卡切换事件中触发数据加载,避免内容为空。

<template>
  <el-tabs v-model="activeTab" type="card" @tab-click="handleTabClick">
    <el-tab-pane label="Tab 1" name="1">
      <el-segmented v-model="activeSegment" :options="segmentOptions1" />
      <div v-if="activeSegment === '1-1'">内容 1-1</div>
      <div v-if="activeSegment === '1-2'">内容 1-2</div>
    </el-tab-pane>
    <el-tab-pane label="Tab 2" name="2">
      <el-segmented v-model="activeSegment" :options="segmentOptions2" />
      <div v-if="activeSegment === '2-1'">内容 2-1</div>
      <div v-if="activeSegment === '2-2'">内容 2-2</div>
    </el-tab-pane>
  </el-tabs>
</template>

<script>
export default {
  data() {
    return {
      activeTab: '1',
      activeSegment: '1-1',
      segmentOptions1: [
        { label: '二级菜单 1-1', value: '1-1' },
        { label: '二级菜单 1-2', value: '1-2' },
      ],
      segmentOptions2: [
        { label: '二级菜单 2-1', value: '2-1' },
        { label: '二级菜单 2-2', value: '2-2' },
      ],
    };
  },
  methods: {
    handleTabClick(tab) {
      // 在这里加载数据
      if (tab.name === '2') {
        this.loadSegmentOptions2();
      }
    },
    loadSegmentOptions2() {
      // 模拟异步数据加载
      setTimeout(() => {
        this.segmentOptions2 = [
          { label: '二级菜单 2-1', value: '2-1' },
          { label: '二级菜单 2-2', value: '2-2' },
        ];
      }, 1000);
    },
  },
};
</script>
推荐问题
宣传栏