为响应博友想要知道三级菜单怎么实现本篇文章先介绍三级菜单的实现,后续再分享其他部分内容

1 修改菜单组件sidebarMenu.vue

  • 图为原代码和修改后代码比对
  • 修改前后的源码如下
<style lang="less">
@import "../styles/menu.less";
</style><template><Menuref="sideMenu":active-name="$route.name":open-names="openNames":theme="menuTheme"width="auto"@on-select="changeMenu"><template v-for="item in menuList"><MenuItem v-if="item.children.length<=0" :name="item.children[0].name" :key="item.name"><!-- <Icon :type="item.icon" :size="iconSize"></Icon> --><span class="iconfont">{{item.icon}}</span><span>{{ itemTitle(item) }}</span></MenuItem><!-- <Submenu v-if="item.children.length > 0" :name="item.name" :key="item.name"><template slot="title"><i class="iconfont" v-html="item.icon"></i><span>{{ itemTitle(item) }}</span></template><template v-for="child in item.children"><MenuItem :name="child.name" :key="child.name"><i class="iconfont" v-html="child.icon"></i><span>{{ L(child.meta.title) }}</span></MenuItem></template></Submenu>--><Submenu v-if="item.children.length > 0" :name="item.name" :key="item.name"><template slot="title"><i class="iconfont" v-html="item.icon"></i><span>{{ itemTitle(item) }}</span></template><template v-for="child in item.children"><MenuItem v-if="!isChild(child.children)" :name="child.name" :key="child.name"><i class="iconfont" v-html="child.icon"></i><span>{{ L(child.meta.title) }}</span></MenuItem><Submenu v-else :name="child.name" :key="child.name"><template slot="title"><i class="iconfont" v-html="child.icon"></i><span>{{ itemTitle(child) }}</span></template><template v-for="child in child.children"><MenuItem v-if="!isChild(child.children)" :name="child.name" :key="child.name"><i class="iconfont" v-html="child.icon"></i><span>{{ L(child.meta.title) }}</span></MenuItem></template></Submenu></template></Submenu></template></Menu>
</template><script lang="ts">
import { Component, Vue, Inject, Prop, Emit } from "vue-property-decorator";
import AbpBase from "../../../lib/abpbase";
@Component({})
export default class SidebarMenu extends AbpBase {name: string = "sidebarMenu";@Prop({ type: Array }) menuList: Array<any>;@Prop({ type: Number }) iconSize: number;@Prop({ type: String, default: "dark" }) menuTheme: string;@Prop({ type: Array }) openNames: Array<string>;itemTitle(item: any): string {return this.L(item.meta.title);}@Emit("on-change")changeMenu(active: string) {}updated() {this.$nextTick(() => {if (this.$refs.sideMenu) {(this.$refs.sideMenu as any).updateActiveName();}});}isChild(item) {if (item && item.length > 0) {return true;} else {return false;}}
}
</script>

2 修改路由菜单配置文件router.ts

  • 在新增的内容里有注释(第三级菜单),全部代码如下
declare global {interface RouterMeta {title: string;}interface Router {path: string;name: string;icon?: string;permission?: string;meta?: RouterMeta;component: any;children?: Array<Router>;}interface System {import(request: string): Promise<any>}var System: System
}
import login from '../views/login.vue'
import home from '../views/home/home.vue'
import main from '../views/main.vue'export const locking = {path: '/locking',name: 'locking',component: () => import('../components/lockscreen/components/locking-page.vue')
};
export const loginRouter: Router = {path: '/',name: 'login',meta: {title: 'LogIn'},component: () => import('../views/login.vue')
};
export const otherRouters: Router = {path: '/main',name: 'main',permission: '',meta: { title: 'ManageMenu' },component: main,children: [{ path: 'home', meta: { title: 'HomePage' }, name: 'home', component: () => import('../views/home/home.vue') }]
}
export const appRouters: Array<Router> = [{path: '/setting',name: 'setting',permission: '',meta: { title: 'ManageMenu' },icon: '',component: main,children: [{ path: 'user', permission: 'Pages.Users', meta: { title: 'Users' }, name: 'user', component: () => import('../views/setting/user/user.vue') },{ path: 'role', permission: 'Pages.Roles', meta: { title: 'Roles' }, name: 'role', component: () => import('../views/setting/role/role.vue') },{ path: 'tenant', permission: 'Pages.Tenants', meta: { title: 'Tenants' }, name: 'tenant', component: () => import('../views/setting/tenant/tenant.vue') },{ path: 'goods', permission: 'Pages.Goods', meta: { title: 'Goods' }, name: 'goods', component: () => import('../views/setting/goods/goods.vue') },//第三级菜单{path: '/main', permission: 'Pages.Goods', meta: { title: 'GoodsManage' }, name: 'goodsManage', component: main,children: [{ path: 'goods', permission: 'Pages.Goods', meta: { title: 'Goods' }, name: 'goods', component: () => import('../views/setting/goods/goods.vue') }]}]
}]
export const routers = [loginRouter,locking,...appRouters,otherRouters
];

知道如何实现三级菜单可以考虑一下怎么实现无限级菜单(以后有时间再分享)

ABP实践(5)-abp前端vue框架之IView实现三级菜单(博友需要特此分享)相关推荐

  1. 朱亚杰 php,thinkphp框架怎么做一个三级菜单?

    thinkphp框架onethink后台支持三级菜单 onethink后台支持三级菜单,CMS管理后台1.0版本本身不支持三级菜单,稍加改动,即可支持无限级分类 /** * 获取控制器菜单数组,二级菜 ...

  2. vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?

    这年头,程序员面试都讲究坐姿,姿势不对,努力白费. 参照下图,请同学们对号入座. 回想一下,自己平时面试的坐姿,你在面试官眼里,大概是什么形象,可能是工程师,也可能是键盘侠,或者找麻烦的. 当然了,想 ...

  3. 后端 学习 前端 Vue 框架基础知识

    文章目录 一.Vue 基础语法学习 1.Vue 语法指令 2.Vue 实例属性 (1)el (2)data (3)methods (4)computed 3.事件修饰符 4.按键修饰符 5.Vue实例 ...

  4. vue的递归组件以及三级菜单的制作

    js里面有递归算法,同时,我们也可以利用props来实现vue模板的递归调用,但是前提是组件拥有 name 属性 父组件:slotDemo.vue: <template><div&g ...

  5. 十一:以理论结合实践方式梳理前端 React 框架 ———框架架构

    前言书明观念 从第一代码农写下第一行代码开始到上个世纪的80年代的软件危机,码农一直在考虑一个问题,怎么让代码写起来更容易.更简单.更舒适?抛开大牛.大神(大牛.大神哪那么容易找到啊 _-)级别的人员 ...

  6. 四:以理论结合实践方式梳理前端 React 框架 ——— React 高级语法

    事件处理 react 内置组件的事件处理 react 内置组件是指 react 中已经定义好的,可以直接使用的如 div.button.input 等与原生 HTML 标签对应的组件 <!DOC ...

  7. 十:以理论结合实践方式梳理前端 React 框架 ———集成框架

    dva 框架简介 dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个 ...

  8. 九:以理论结合实践方式梳理前端 React 框架 ——— 简述中间件

    redux-saga 基本简介 中间件是一种独立运行于各个框架之间的代码,以函数的形式存在,连接在一起,形成一个异步队列,可以访问请求对象和响应对象,可以对请求进行拦截处理,再将处理后的控制权向下传递 ...

  9. Vue中的this.$nextTick方法的使用 [前端][Vue框架]

    Vue中的this.$nextTick方法的使用 因为在vue中当组件的data中的数据发生了变化之后, 如果这个data中的数据与某个Dom元素有关, 那么这个时候这个Dom元素不会立即更新, vu ...

最新文章

  1. Android Bitmap圆角
  2. 【软件工程】第0次个人作业
  3. Nginx服务器的Web请求处理机制
  4. keil5中文乱码的解决
  5. oracle中修改process
  6. 官方中文文档上线了!Python各种教程已汉化。
  7. android启动activity的详细过程
  8. 开发smartphone应用,无法生成cab文件?
  9. pip install 到指定的目录下,查看pip包位置
  10. Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋
  11. 浏览器趋势2016年9月:浏览器大战结束了吗?
  12. 从输出海外吃鸡游戏浅谈创新
  13. Eclipse的下载、安装与汉化
  14. 如何绕开对通用VMware虚拟机检测
  15. LabVIEW的万金油框架
  16. 智慧城市与数字政府、城市大脑、一网统管之间什么关系
  17. 海关 实时数据 企业联调接口 开发步骤与概要
  18. 文件夹加密超级大师的金钻加密和闪电加密有什么区别?
  19. div与表格应用实例——计算器布局
  20. 企业微信怎么输入服务器id,在后台设置企业微信信息时,如何获得企业ID( CorpId )和 Secret ?...

热门文章

  1. 怎么删除github项目/仓库中已经上传的代码
  2. window下配置qemu虚拟机联网
  3. note edge android 6.0 root,三星Note Edge N9150刷机包带ROOT权限固件ZCU1BOH2线刷Rom
  4. vs2022创建窗口应用程序
  5. 解决8080端口号被占用问题
  6. .NET Quartz介绍
  7. 第六课:ResNeXt学习
  8. 2018中国计算机所有相关会议,2018年计算机视觉顶会和人工智能顶级会议时间表...
  9. 字节流与字符流(一)
  10. java怎么快速补缺_Java基础查漏补缺(1)