vue+quasar使用递归实现动态多级菜单

本文实例为大家分享了vue+quasar使用递归实现动态多级菜单的具体代码,供大家参考,具体内容如下

效果图:

菜单初始化入口 menu.vue,初始化侧边栏菜单组建,<my-q-menu/>才是递归开始

<template>
  <q-drawer
    v-model="is_hide_"
    show-if-above
    bordered
    content-class="bg-grey-2"
    :width="240"
  >
  <q-scroll-area class="fit">
    <!-- 递归实现 循环菜单 -->
    <my-q-menu/>
  </q-scroll-area>
  </q-drawer>
</template>

<script>
import MyQMenu from './myQMenu'
export default {
  name: 'myMenu',
  components: { MyQMenu },
  data () {
    return {
      leftDrawerOpen: true   
    }
  },
  props: ['is_hide'],
  computed: {
    is_hide_: {
      get () { return this.is_hide },    // boolean 型,用于控制侧边菜单栏是否显示
      set () {}
    }
  },
}
</script>

菜单递归入口 <my-q-menu/>,传入menuList.json菜单配置信息

参数说明

@my-router 菜单配置信息
@init-level 初始化菜单缩进大小

<template>
  <div>
    <!-- 动态菜单 -->
    <q-list>
      <my-q-menu-item :my-router="menuList" :init-level="0"/>
    </q-list>
  </div>
</template>

<script>
import MyQMenuItem from './myQMenuItem'

export default {
  name: 'my-q-menu',
  components: { MyQMenuItem },
  data () {
    return {
      menuList: [
        {
          icon: 'inbox',
          label: '菜单1',
          children: [
            {
              icon: 'perm_identity',
              label: '菜单1-1',
              path: '/about'
            },
            {
              icon: 'delete',
              label: '菜单1-2',
              children: [
                {
                  icon: 'settings',
                  label: '菜单2-1',
                  path: '/noty'
                }
              ]
            }
          ]
        },
        {
          isItemLabel: true,
          Label_text: 'item-label '
        },
        {
          icon: 'feedback',
          label: '菜单数据结构',
          path: '/test',
          hidden: false
        }
      ]
    }
  }
}
</script>

菜单元素递归执行体 <my-q-menu-item/>

<!--
   动态菜单 item 递归实现
   myRouter : 菜单列表
   initLevel : 菜单初始化缩进等级
   author : ths
-->
<template>
  <div>
  
    <div v-for="(item,index) in myRouter" :key="index">

      <!-- 当菜单item标识为 ItemLabel 时,显示Label_text,不渲染为菜单 -->
      <q-item-label v-if="item.isItemLabel" header class="text-weight-bold text-uppercase">
        {{item.Label_text}}
      </q-item-label>

      <!-- 先判断当前菜单是否需要显示 -->
      <div v-if="!item.hidden && !item.isItemLabel">
      
        <!-- 当没有子菜单时,结束递归 -->
        <div v-if="!item.children">
          <q-expansion-item
            :header-inset-level="initLevel"
            expand-icon="1"
            :to="item.path"
            :icon="item.icon"
            :label="item.label"
          />
        </div>
        
        <!-- 子菜单依然存在时,继续递归 -->
        <div v-else>
          <q-expansion-item
            expand-separator
            :header-inset-level="initLevel"
            :to="item.path"
            :icon="item.icon"
            :label="item.label"
          >
            <!-- 进入下一次递归 -->
            <my-q-menu-item :my-router="item.children" :init-level="initLevel+0.3"/>
          </q-expansion-item>
        </div>
      </div>

    </div>
  </div>
</template>

<script>
export default {
  name: 'my-q-menu-item',
  data () {
    return {}
  },
  props: ['myRouter', 'initLevel']
}
</script>

菜单元素解释

menuList: [
        {
          icon: 'inbox',        //图标
          label: '菜单1',        //label
          children: [
            {
              icon: 'perm_identity',   
              label: '菜单1-1',
              path: '/about'     //路径
            },
            {
              icon: 'delete',
              label: '菜单1-2',
              children: [
                {
                  icon: 'settings',
                  label: '菜单2-1',
                  path: '/noty'
                }
              ]
            }
          ]
        },
        {
          isItemLabel: true,      //是否分隔栏
          Label_text: 'item-label '   //分隔栏label
        },
        {
          icon: 'feedback',
          label: '菜单数据结构',
          path: '/test',
          hidden: false            //是否隐藏
        }
      ]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue+ java 实现多级菜单递归效果

    效果如图: 大概思路:树形视图使用的是vue官方事例代码,java负责封装数据,按照vue官方事例的数据结构封装数据即可.有两个需要关注的点: 1.官方事例的数据结构是一个对象里面包含着集合,而不是一个集合对象 2.递归算法 上代码: 前端:html+js <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdn.

  • vue递归组件实现elementUI多级菜单

    本文实例为大家分享了vue递归组件实现elementUI多级菜单的具体代码,供大家参考,具体内容如下 先看效果: 一.子组件 <template>     <div class="myDiv">         <!-- 这里的listAll用于接收父组件传递进来的菜单列表 -->         <template v-for="(item,i) in listAll">             <!-- 有c

  • jdk1.8+vue elementui实现多级菜单功能

    前言:在学习谷粒商城的时候,在做分类维护树形菜单维护的功能中,项目中只讲了菜单三级树怎么实现,想拓展一下多级菜单,功能已实现,记录一下,有不对的地方欢迎指正. 一.后端部分 使用Jdk1.8的新特性Stream和lamada表达式,数据库的框架使用苞米豆的mybatis plus,话不多说,上代码 1. 新建ManyTree类,可封装成工具类 import com.atguigu.gulimall.product.entity.CategoryEntity; import com.google.

  • springboot + vue 实现递归生成多级菜单(实例代码)

    开发过程中,涉及到多级菜单的应用,找了一些资料案例实现如下(使用springboot+layui+oracle): 创建菜单表 : -- 创建菜单表 create table wxmini_menus( menu_id number unique, --菜单ID menu_name varchar2(20), menu_url varchar2(200), menu_icon varchar2(100), parent_id number, --父菜单ID status varchar2(10)

  • 详解VUE Element-UI多级菜单动态渲染的组件

    以下是组件代码: <template> <div class="navMenu"> <label v-for="navMenu in navMenus"> <el-menu-item v-if="navMenu.childs==null&&navMenu.entity&&navMenu.entity.state==='ENABLE'" :key="navMenu.

  • Vue 递归多级菜单的实例代码

    考虑以下菜单数据: [ { name: "About", path: "/about", children: [ { name: "About US", path: "/about/us" }, { name: "About Comp", path: "/about/company", children: [ { name: "About Comp A", path:

  • vue实现多级菜单效果

    本次记录基于iview3框架实现多级菜单+vue router实现页面切换 方法一: 使用Tree 树形控件,官方文档 以官方demo为例,数据中添加URL属性,用于路由跳转,正式项目中该tree控件的数据由后端给出,需要注意的是后端给出的URL跳转地址最前一定要看清有没有"/" ,如果没有自己手动加或后端改,没有这个"/" 斜杠会导致路由跳转失败. 思路:根据官方文档里面写用on-select-change事件返回当前已选中的节点数组.当前项,就利用返回的当前项数

  • vue+quasar使用递归实现动态多级菜单

    本文实例为大家分享了vue+quasar使用递归实现动态多级菜单的具体代码,供大家参考,具体内容如下 效果图: 菜单初始化入口 menu.vue,初始化侧边栏菜单组建,<my-q-menu/>才是递归开始 <template>   <q-drawer     v-model="is_hide_"     show-if-above     bordered     content-class="bg-grey-2"     :width

  • vue后台管理如何配置动态路由菜单

    目录 后台管理配置动态路由菜单 根据权限生成动态路由及导航菜单 后台管理配置动态路由菜单 前段时间做一个后台管理项目,因为超级管理员可以给普通管理员动态更改权限,所以vue-element-admin里的写死的权限路由菜单就不太适合我,自己研究了好半天,经历了各种死循环,终于差不多弄出了一个,可能会有点啰嗦,总结一下: 我这个后台分为三个角色:超级管理员.企业管理员和普通管理员.其中,超级管理员可以查看所有的路由菜单,企业管理员也是固定的几个菜单,所以,超级管理员和企业管理员是我在前端写好的路由

  • layui递归实现动态左侧菜单

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 我知道两种方式实现: 一.先加载所有的主菜单,之后通过点击主菜单在加载该菜单的子菜单(缺点,如果判断是否已经加载过,那么动态添加了菜单,这里显示不出来,不判断的话,每次点击都会请求一次,这样请求的次数就太多了,服务器不太好的话可能会成为高并发的一个原因) 二.就是以下的了,使用递归一次性全部加载出来(缺点,耗费服务器内存) 如果动态添加一个菜单,你当前页面不手动刷新菜单不会显示,这个问题可以考虑用websock

  • asp.net Menu控件+SQLServer实现动态多级菜单

    首先是数据表的设计 其中treeId指的是该菜单项的父ID,如果treeId为0.表示该菜单项为根菜单项,否则表示他为某菜单项的子菜单,比如id为2的项,他的父节点是1.则他是张三的子菜单,而张三是根菜单,position只用于根菜单项,用于控制显示的顺序. 往网页里拖入一个menu控件,然后添加代码 复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Web; using Sy

  • vue+elementUI组件递归实现可折叠动态渲染多级侧边栏导航

    早就实现了功能,但是发现点击的时候,选中的菜单项背景色会变白,周五时候仔细观察了一下,发现并不是调整样式的问题,而是选项没有被选中,于是好好研究了一下组件递归这块,总结记录一下心路历程 一.概念 递归:递归其实说白了,就是自己调用自己,样子就像是套娃一个套一个的,小时候玩过一个游戏汉诺塔就是利用的递归原理: 函数递归:函数利用函数名还调用自己 组件递归:所以组件递归利用的是vue组件中的name属性来实现的 二.需求 实现可折叠动态渲染多级侧边栏导航 三.分析 1.观察到侧边栏导航是一级一级的,

随机推荐