Vue中二级菜单的实现

news2024/12/25 0:26:41

在不使用ElementUi等框架的情况下,制作一个二级菜单,网上搜寻很多资料,但部分要不只显示HTML结构,不显示CSS样式,要不就是复杂的让人无法理解。

效果图:

针对菜单做了CSS样式修饰,给一级二级菜单都添加了鼠标悬浮事件,当悬浮到某个菜单时,背景颜色,字体颜色发生改变。当点击某个一级菜单时,二级菜单实现显示和隐藏的动态切换。

菜单的HTML结构:
<div class="nav">
          --------------------一级菜单------------------
        <ul>
          <li
            v-for="item in menus"
            :key="item.id"
            @click="changeCheck(item.id)"
            :class="{ check: currentTag == item.path }"
            class="mainMenu"
          >
            <router-link
              :to="{name:item.path,params:userName}"
              class="mainA"
              @click.native="TabName(item.title)"
              >{{ item.title }}</router-link
            >
          ------------------二级菜单----------------------
            <ul v-if="item.children && item.active">
              <li
                class="subMneu"
                v-for="(child, index) in item.children"
                :key="index"
                @click="clickSubMenu(item,child.title)"
              >
                <router-link
                  class="menuB"
                  :to="{name:child.path,params:userName}"
                  :class="{ menu_active: child.active }"
                  >{{ child.title }}</router-link
                >
              </li>
            </ul>
          </li>
        </ul>
      </div>
代码分析:
  1. 针对菜单采用的是ul列表,然后采用v-for循环对菜单数据进行循环,菜单采用的是动态样式 : class

当点击菜单的path地址和菜单中的某个path相等时,动态渲染该样式。

  1. li包含<router-link>是为了当点击该菜单时,跳转到相应的内容

菜单的JS代码:

data( )函数数据:

export default {
  components: {

  },
  data() {
    return {
      menus: [
        { id: 1, title: "用户管理", path: "UserMannger", active: false },
        {
          id: 2,
          title: "商品管理",
          path: "goodsManger",
          active: false,
          children: [
            { id: 21, title: "增加商品", path: "addGoods", active: false },
          ],
        },
        { di: 3, title: "关于我们", path: "about", active: false },
      ],
      currentTag: "",
      tabName: "",
      flag2: true,
      // tabName:'用户管理',
      userName:''
    };
  },

JS代码

methods: {
    changeCheck(id) {

      const obj = this.menus.find((item) => item.id == id);
      this.menus.find((item) => {
        if (item.id == id) {
          item.active = !item.active;
          if (item.children) {
            item.children.active = !item.active;
          }         
        }
      });
      this.currentTag = obj.path;
    },
    clickSubMenu(main,val) {
      this.tabName = val
      main.children[0].active = !main.children[0].active
      main.active = !main.children[0].active;
    },
    backHome() {
      this.$router.push("/UserMannger/123");
    },
    getLogin2(val){
      this.userName = val
    },
    TabName(val){
      console.log(val);
      this.tabName = val
    }
  },
  created() {
    this.$bus.$on('toHome',this.getLogin2)
  },
};

方法中 changeCheck函数分析:

  1. 首先先接收点击菜单的id,对menus数字进行遍历,当id相同时,将该菜单的active属性进行动态改变,这样做是为了动态切换样式。在遍历中还要对子菜单进行判断,如果有子菜单则将该子菜单的active属性改变

方法中 clickSubMneu函数分析:

  1. 因为该方法是当点击子菜单触发此事件,触发事件时传入该子菜单的一级菜单,然后将该菜单的子菜单的active属性进行动态改变,并且将主菜单的active属性始终与子菜单保持相反。

  1. 因为这里只设置了一个子菜单所以下标为0,当需要设置多个子菜单时,还需要传入index和子菜单的index然后进行判断方法和对一级菜单的判断相同。

CSS代码
当点击子菜单的a标签的公共样式
.menu_active {
  color: red;
  display: block;
  width: 100%;
  text-decoration: none;
  color: rgb(255, 208, 75);
  background-color: #409eff;
}

菜单修饰
.nav {
      height: 100%;
      flex-grow: 1;
      background-color: #001529;
      ul {
        .mainMenu {
          margin-top: 20px;
          width: 100%;
          text-align: center;
          line-height: 50px;
          color: white;

          .mainA {
            display: block;
            width: 100%;
            text-decoration: none;
            color: white;
            &:hover {
              background-color: #409eff;
            }
            &:active {
              color: rgb(255, 208, 75);
            }
          }
        }
      }
    }

这里采用的SCSS预编译语言:

在菜单css修饰中需要注意的是,一定要给一级菜单和二级菜单起名字,即使scss能够嵌套,依然会发生样式穿透的bug,所以针对一级菜单和二级菜单的样式进行单独修饰。

这里还需要知道的是 scss中有 :active和 : hover 的伪类用法,前者是当点击时触发该样式,后者是鼠标悬浮时触发的样式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

四、移植FATFS文件系统 前面第3章&#xff0c;完成了SD NAND的驱动代码编写&#xff0c;这一章节实现FATFS文件的移植。 4.1 FATFS文件系统介绍 &#xff08;1&#xff09;介绍 FatFs 是一种完全免费开源的 FAT 文件系统模块&#xff0c;专门为小型的嵌入式系统而设计。它完…

07--组件

一、小程序组件分类微信团队为开发者提供了一系列基础组件&#xff0c;开发者可以通过组合这些基础组件进行快速开发。小程序中的组件也是非常丰富的&#xff0c;开发者可以基于组件快速搭建出漂亮的页面结构。小程序中的组件其实相当于网页中的HTML标签&#xff0c;只不过标签…

5年测试路,终于爬到了半山腰,结果碰到00后入场,我该拿什么争,我不想35岁被淘汰......

软件测试是一个付出就有回报的工作&#xff0c;可能很多人会说软件测试就是吃青春饭&#xff0c;然而其他工作又何尝不是&#xff1f;没有哪一家公司养尸位素餐之人&#xff0c;大龄员工有被辞退的&#xff0c;也有没被辞退的。干任何职业&#xff0c;抱着一劳永逸的心态&#…

关于k8s集群备份和恢复工具Velero 的一些笔记整理

写在前面 分享一个k8s集群容灾备份恢复开源工具 Velero博文内容涉及&#xff1a; Velero 的简单介绍Velero 安装下载备份恢复 Demo&#xff0c;以及容灾测试 Demo恢复失败情况分析 理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0…

第九届蓝桥杯省赛 C++ A/B组 - 全球变暖

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;全球变暖 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…

分布式架构设计模式

咖啡不冲&#xff0c;你一定会成功 分布式架构设计模式一、什么是设计模式&#xff1f;1.1 设计模式的由来1.2 设计模式有哪些种类1.3 如何学习设计模式二、六大设计原则2.1 开闭原则2.2 单一职责原则2.3 里氏替换原则2.4 迪米特法则2.5 接口隔离原则2.6 依赖倒置原则三、创建型…

websocket原理及简单应用

websocket是什么&#xff1f; 一般做系统开发前后端交互使用最多的就是http协议&#xff0c;但http协议是无状态协议每一次前端发起的请求都认为是一次单独的请求和之前的请求无任何关系&#xff0c;所以我们需要http协议分别用户信息时&#xff0c;就需要使用cookie、session…

Rust学习总结之if,while,loop,for使用

目录 一&#xff1a;if的使用 二&#xff1a;while的使用 三&#xff1a;loop的使用 四&#xff1a;for的使用 本文总结的四种语句&#xff08;if&#xff0c;while&#xff0c;loop&#xff0c;for&#xff09;除了loop&#xff0c;其他的三个在C语言或者Python中都是常见…

DDD系列 - 第1讲 DDD相关概念入门

目录一、引言二、 统一语言Ubiquitous Language三、 三个阶段&#xff08;战略、战术、实现&#xff09;阶段1&#xff1a;战略设计阶段阶段2&#xff1a;战术设计阶段阶段3&#xff1a;技术实现阶段四、限界上下文Bounded Context五、上下文映射Context Map防腐层Anti-Corrupt…

深度学习代码怎么读-小白阶段性思路

深度学习代码怎么读-小白阶段性思路目前思路学习资料读代码工具-chatgpt目前思路 努力上路的小白一枚&#xff0c;麻烦路过的大佬指导一二&#xff0c;同时希望能和大家交流学习~ 和学长、实习老师们交流后的目前思路&#xff1a; 先找到自己研究领域的顶级期刊&#xff0c;…

21 Nacos客户端本地缓存及故障转移

Nacos客户端本地缓存及故障转移 在Nacos本地缓存的时候有的时候必然会出现一些故障&#xff0c;这些故障就需要进行处理&#xff0c;涉及到的核心类为ServiceInfoHolder和FailoverReactor。 本地缓存有两方面&#xff0c;第一方面是从注册中心获得实例信息会缓存在内存当中&a…

AGV机器人出圈:助力产线物流自动化

随着开年档电影《流浪地球2》的热映&#xff0c;里面的四足仿生机器人机械狗“笨笨”、可穿戴的外骨骼机器人等“黑科技”&#xff0c;都让人对机器人的魅力刮目相看&#xff0c;机器人成功“出圈”了&#xff0c;随着智能技术的发展与进步&#xff0c;我们常见的机器人种类越来…

Linux命令之sed

sed&#xff0c;Stream Editor&#xff08;字符流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff0c;是操作、过滤、转换文本内容的工具。 常用功能包括结合正则表达式对文件实现快速的增删改查。 工作原理 sed有2个空间来缓存数据&#xff0c;paattern space&am…

Qt交叉编译环境搭建

环境及版本&#xff1a;Deepin 20.3 Qt 5.12.9 arm编译工具 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz 1.下载Qt源码&#xff1a;qt-everywhere-src-5.12.9.tar.xz&#xff0c;并解压 2.下载arm编译工具&#xff1a; gcc-linaro-7.5.0-2019.12-x86_64_arm…

央企集团是怎么设置信息化、数字化部门的?

在数字经济大潮中&#xff0c;数字化转型已不是企业的“选修课”&#xff0c;而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中&#xff0c;国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一&#xff0c;数字化能力也成为衡量…

代码随想录【Day31】| 455. 分发饼干、376. 摆动序列、53. 最大子数组和

455. 分发饼干 题目链接 题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff…

用Docker搭建yolov5开发环境

拉取镜像 sudo docker pull pytorch/pytorch:latest 创建容器 sudo docker run -it -d --gpus "device0" pytorch/pytorch bash 查看所有容器 sudo docker ps -a 查看运行中的容器 sudo docker ps 进入容器 docker start -i 容器ID 将依赖包全都导入到requiremen…

如何将图数据库应用于电影智能推荐

导读 电影&#xff0c;是一种结合视觉与听觉的现代艺术。如今&#xff0c;电影已不单是人们娱乐消遣的生活方式&#xff0c;也逐渐成为国家文化软实力的重要标志之一。据有关数据统计&#xff0c;2021年中国影视行业市场规模达2349亿元&#xff0c;同比增长23.2%&#xff0c;预…

java--IO

IO1.文件流2.常用的文件操作&#xff08;1&#xff09;根据路径构建一个File对象&#xff08;2&#xff09;根据父目录文件子路径构建&#xff08;3&#xff09;根据父目录子路径构建&#xff08;4&#xff09;获取文件相关信息&#xff08;5&#xff09;目录的操作和文件的删除…

计算机图形学07:有效边表法的多边形扫描转换

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…