当前位置: 首页 > news >正文

vue3:十一、主页面布局(进入指定菜单页面,默认锁定到左侧菜单)

一、效果

直接进入home页面,直接展开对应的菜单项

二、具体实现

1、菜单容器增加默认选中变量

在菜单容器中将默认展开菜单default-openeds修改为默认选中菜单default-active

2、引入useRoute方法

引入该方法为了获取当前页面的路径

import { useRoute } from 'vue-router'

3、获取当页面路径,选中菜单项变量设置

通过route获取到路径信息,然后将其赋值给默认选中菜单项

//获取当前页面路径
const route = useRoute();
const currentPath = route.path;
const activeMenu = ref(currentPath);

三、完整代码

<template>
  <el-container class="layout-container-demo" style="height: 100vh">
    <el-aside width="200px">
      <el-scrollbar>
        <!-- default-openeds:默认展开菜单 -->
        <!-- default-active:默认选中菜单 -->
        <el-menu :default-active="activeMenu" :router="true">
          <!-- 遍历一级菜单 -->
          <template v-for="(item, index) in menu" :key="index">
            <!-- 如果一级菜单有子菜单,渲染 el-sub-menu -->
            <el-sub-menu v-if="item.children && item.children.length > 0" :index="`${index + 1}`">
              <template #title>
                <el-icon v-if="item.icon">
                  <component :is="item.icon" />
                </el-icon>
                {{ item.name }}
              </template>
              <!-- 遍历二级菜单 -->
              <el-menu-item v-for="(secondmenu, secondindex) in item.children" :key="secondindex"
                :index="secondmenu.path">
                {{ secondmenu.name }}
              </el-menu-item>
            </el-sub-menu>
            <!-- 如果一级菜单没有子菜单,渲染 el-menu-item -->
            <el-menu-item v-else :index="item.path">
              <el-icon v-if="item.icon">
                <component :is="item.icon" />
              </el-icon>
              {{ item.name }}
            </el-menu-item>
          </template>
        </el-menu>
      </el-scrollbar>
    </el-aside>

    <el-container>
      <el-header style="text-align: right; font-size: 12px">
        <div class="toolbar">
          <el-dropdown>
            <el-icon style="margin-right: 8px; margin-top: 1px">
              <setting />
            </el-icon>
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item>View</el-dropdown-item>
                <el-dropdown-item>Add</el-dropdown-item>
                <el-dropdown-item>Delete</el-dropdown-item>
              </el-dropdown-menu>
            </template>
          </el-dropdown>
          <span>Tom</span>
        </div>
      </el-header>
      <!-- 右侧内容 -->
      <el-main>
        <el-scrollbar>
          <RouterView />
        </el-scrollbar>
      </el-main>
      <!-- 底部信息 -->
      <el-footer class="flex flex-center">
        <span>@2025-2030 wen</span>
      </el-footer>
    </el-container>
  </el-container>
</template>

<script setup>
import { ref,reactive } from 'vue'
import { useRoute } from 'vue-router'

//获取当前页面路径
const route = useRoute();
const currentPath = route.path;
const activeMenu = ref(currentPath);

// 菜单
const menu = reactive([
  {
    name: 'Navigator One',
    icon: "message",
    path: '/about',
  },
  {
    name: 'Navigator Two',
    icon: "message",
    children: [
      {
        name: 'Option 1',
        path: '/home',
      },
      {
        name: 'Option 2',
      },
      {
        name: 'Option 3',
      },
      {
        name: 'Option 4',
      },
    ]
  },
]);

</script>

<style scoped>
.layout-container-demo .el-header {
  position: relative;
  background-color: var(--el-color-primary-light-7);
  color: var(--el-text-color-primary);
}

.layout-container-demo .el-aside {
  color: var(--el-text-color-primary);
  background: var(--el-color-primary-light-8);
}

.layout-container-demo .el-menu {
  border-right: none;
}

.layout-container-demo .el-main {
  padding: 0;
}

.layout-container-demo .toolbar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  right: 20px;
}
</style>

相关文章:

  • 【MySQL】全面学习数据库查询技巧:查询指令深度学习指南
  • 损失函数理解(二)——交叉熵损失
  • C# WebForm显示bootstrap模态对话框
  • 《燃气管网运行工》考试资料分享,附答案
  • 回调方法传参汇总
  • Nginx:access_log访问状态码499解决
  • rust学习笔记19-泛型
  • 机器学习——KNN数据集划分
  • 深度学习1—Python基础
  • 「一起学后端」Nest.js + MySQL 查询方法教学文档
  • Docker Compose 常用命令详解
  • Cursor平替免费软件开发工具使用感受和推荐
  • vim的一般操作(分屏操作) 和 Makefile 和 gdb
  • 从零到一开发一款 DeepSeek 聊天机器人
  • 【支持二次开发】基于YOLO系列的车辆行人检测 | 含完整源码、数据集、环境配置和训练教程
  • 程序算法基础
  • 思源配置阿里云 OSS 踩坑记
  • 寻找左边第一个更小值
  • RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”
  • 感知识别算法Jetson环境部署测试记录
  • 南部战区位南海海域进行例行巡航
  • 一周人物|卡鲁等入围英国特纳奖,李学明新展中国美术馆
  • 《中国奇谭》首部动画电影《浪浪山小妖怪》定档8月2日
  • 走访中广核风电基地:701台风机如何乘风化电,点亮3000万人绿色生活
  • 葡萄牙、西班牙发生大范围停电
  • 2025上海浪琴环球马术冠军赛开赛在即,首批赛马今晨抵沪