用vue实现的二级菜单

本文介绍了如何使用Vue来处理二级菜单的显示与隐藏,以及点击导航时的样式变化。当点击含有二级菜单的导航项时,二级菜单会切换显示状态;若无二级菜单,则该导航项变色以标识当前位置,同时确保导航中只有一个菜单高亮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是对二级菜单和当前点击的处理:
点击导航时,如果有二级菜单,就切换二级菜单显示状态(显示或者关闭),如果没有二级菜单,就变色,表示页面处于当前位置,并且导航中最多只能有一个菜单变色。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>这是一个v-for的导航条</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script>
  <link rel="stylesheet" href="nav.css">
</head>
<body>
<div id="pages">
  <ul id="side-menu">
    <li class="menu-unit" v-for="menu in menus">
      <a id="menu-url" v-bind:href="menu.url"
         v-bind:class="{ 'menu-active': menu.active && !menu.secondMenus}"
         v-on:click="showToggle(menu)"
      >
        <i v-bind:class="menu.icon"></i>
        <span>{{ menu.text }}</span>
        <i v-if="menu.downIcon" v-bind:class="menu.downIcon"></i>
      </a>
      <ul id="side-second-menu" v-if="menu.secondMenus && menu.active">
        <li v-for="secMenu in menu.secondMenus" v-on:click="showToggle(menu, secMenu)">
          <a v-bind:href="secMenu.url"
             v-bind:class="{ 'menu-active': secMenu.active }">
            <span>{{ secMenu.text }}</span>
          </a>
        </li>
      </ul>
    </li>
  </ul>
</div>

<script>
  var vm = new Vue({
    el: '#side-menu',
    data: {
      menus: [
        {
          text: '首页',
          icon: 'glyphicon glyphicon-apple',
          active: false
        },
        {
          text: '文档',
          // url: 'https://www.baidu.com/',
          icon: 'glyphicon glyphicon-book',
          active: false
        },
        {
          text: '引导页',
          // url: 'https://www.baidu.com/',
          icon: 'glyphicon glyphicon-send',
          active: false
        },
        {
          text: '权限测试页',
          icon: 'glyphicon glyphicon-lock',
          downIcon: 'glyphicon glyphicon-menu-down',
          active: false,
          secondMenus: [
            {text: '页面权限', url: '#', active: false},
            {text: '权限指令', url: '#', active: false},
          ]
        },
        {
          text: '图标',
          icon: 'glyphicon glyphicon-pawn',
          active: false,
          // url: 'https://www.baidu.com/'
        },
      ]
    },
    methods: {
      showToggle: function (menu, secMenu) {
        // 如果传入了二级菜单
        if (secMenu) {
          secMenu.active = true;
          // 更新menus数据
          this.refreshMenuTree(this.menus, menu, secMenu);
        } else {
          if (menu.secondMenus) {
            menu.active = !menu.active;
          } else {
            menu.active = true;
            // 更新menus数据
            this.refreshMenuTree(this.menus, menu, secMenu);
          }
        }
      },

      /**
       * 解释:对于菜单栏active置为true的逻辑,可以简化为,我点击谁谁就active,其他的菜单项active都变为
       * false。但特殊情况为二级菜单,二级菜单点击后自己的active变为true,但父菜单项的active不能变false。
       * 所以问题简化为:
       * 1. 点击的菜单项的active变为true
       * 2. 遍历整个菜单的所有数据项,不等于我点击的这个菜单项的active都变为false
       * (但二级菜单要考虑其父菜单项不能变false,即除了我点击的这个和我的父菜单项外都变false)
       *
       * 关键问题即:用树的遍历解决菜单所有数据项的遍历和active取反,即对于被遍历的每个菜单项来说,
       * 只要不等于我传入的一级菜单和二级菜单,active就变成false
       *
       * 整体逻辑即:menus中的数据项,进行遍历,如果不等于传入的menu或者secMenu则直接置为false
       * @param menus 包含menu数据项的数组,如一级菜单数组,二级菜单数组
       * @param menu 应该激活的一级菜单项
       * @param secMenu 应该激活的二级菜单项
       */
      refreshMenuTree(menus, menu, secMenu) {
        // 开始遍历
        menus.forEach(function (item) {
          // 如果菜单项不等于传入的一级菜单项或二级菜单项,则active置为false
          if (!(item === menu || item === secMenu || (item.secondMenus && item.active))) {
            item.active = false;
          }

          // 如果菜单项包含二级菜单列表,则遍历此列表
          if (item.secondMenus) {
            this.refreshMenuTree(item.secondMenus, menu, secMenu);
          }
          // 使用.bind(this)给函数的this绑定为外层的作用域,要不然this.refreshMenuTree方法取不到
        }.bind(this));
      },

    }
  })
</script>

<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>

</body>
</html>

感谢小哥哥!

Vue.js中实现二级菜单项下的禁用通常是通过组件的状态管理以及事件驱动的方式来控制的。假设你有一个基于递归组件的导航菜单,你可以这样做: 1. **数据结构设计**: 首先,你的`Menu`组件可以维护一个数组,每个元素代表一级菜单项,包含子菜单和是否禁用的标志。例如: ```javascript data() { return { menus: [ { name: '一级菜单', disabled: false, subMenus: [{ ... }, { ... }] }, // ... ] } } ``` 2. **模板渲染**: 在模板中,对于一级菜单项,显示其名称,并根据`disabled`属性设置样式。如果存在子菜单,再次递归调用自身展示子菜单。 ```html <ul> <li v-for="menu in menus" :key="menu.name"> <span :class="{ disabled: menu.disabled }">{{ menu.name }}</span> <transition-group tag="ul" v-if="menu.subMenus && !menu.disabled"> <li v-for="subMenu in menu.subMenus" :key="subMenu.name">{{ subMenu.name }}</li> </transition-group> </li> </ul> ``` 3. **状态更新**: 当需要禁用某个二级菜单项时,可以在适当的地方修改`menus`数组中对应项的`disabled`属性。比如点击操作或其他条件判断。 4. **事件处理**: 可以添加点击事件监听器,禁用对应的子菜单。这里是一个简单的例子: ```javascript methods: { toggleDisabled(menuIndex) { this.menus[menuIndex].disabled = true; // 禁用当前项 } } ``` 然后在模板上绑定这个方法: ```html <li @click.prevent="toggleDisabled($index)"> ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值