一、使用官方例子

<template>
<div style="width: 256px">
<a-button type="primary" @click="toggleCollapsed" style="margin-bottom: 16px">
<a-icon :type="collapsed ? 'menu-unfold' : 'menu-fold'" />
</a-button>
<a-menu
:defaultSelectedKeys="['1']"
:defaultOpenKeys="['2']"
mode="inline"
theme="dark"
:inlineCollapsed="collapsed"
>
<template v-for="item in list">
<a-menu-item v-if="!item.children" :key="item.key">
<a-icon type="pie-chart" />
<span>{{ item.title }}</span>
</a-menu-item>
<sub-menu v-else :menu-info="item" :key="item.key" />
</template>
</a-menu>
</div>
</template> <script>
// recommend use functional component
// <template functional>
// <a-sub-menu :key="props.menuInfo.key">
// <span slot="title">
// <a-icon type="mail" /><span>{{ props.menuInfo.title }}</span>
// </span>
// <template v-for="item in props.menuInfo.children">
// <a-menu-item v-if="!item.children" :key="item.key">
// <a-icon type="pie-chart" />
// <span>{{ item.title }}</span>
// </a-menu-item>
// <sub-menu v-else :key="item.key" :menu-info="item" />
// </template>
// </a-sub-menu>
// </template>
// export default {
// props: ['menuInfo'],
// }; import { Menu } from 'ant-design-vue';
const SubMenu = {
template: `
<a-sub-menu :key="menuInfo.key" v-bind="$props" v-on="$listeners">
<span slot="title">
<a-icon type="mail" /><span>{{ menuInfo.title }}</span>
</span>
<template v-for="item in menuInfo.children">
<a-menu-item v-if="!item.children" :key="item.key">
<a-icon type="pie-chart" />
<span>{{ item.title }}</span>
</a-menu-item>
<sub-menu v-else :key="item.key" :menu-info="item" />
</template>
</a-sub-menu>
`,
name: 'SubMenu',
// must add isSubMenu: true
isSubMenu: true,
props: {
...Menu.SubMenu.props,
// Cannot overlap with properties within Menu.SubMenu.props
menuInfo: {
type: Object,
default: () => ({}),
},
},
};
export default {
components: {
'sub-menu': SubMenu,
},
data() {
return {
collapsed: false,
list: [
{
key: '1',
title: 'Option 1',
},
{
key: '2',
title: 'Navigation 2',
children: [
{
key: '2.1',
title: 'Navigation 3',
children: [{ key: '2.1.1', title: 'Option 2.1.1' }],
},
],
},
],
};
},
methods: {
toggleCollapsed() {
this.collapsed = !this.collapsed;
},
},
};
</script>

增加@click事件

点击弹出效果如下图,注意:这里@click后不能直接写@click="alert('a')",会报TypeError: _vm.alert is not a function

二、其他实现方法

一般的后台系统都有一个树形导航菜单,具体实现如下,主要参考
https://my.oschina.net/u/4131669/blog/3048416

menuList: [
{
'name': '首页',
'url': 'http://192.168.1.100:9999',
'iconType': 'laptop',
'sidebars': []
},
{
'name': '企业信息',
'url': null,
'iconType': 'bars',
'sidebars': [
{
'name': '公司管理',
'url': 'http://192.168.1.100:8890//swagger-ui.html',
'iconType': 'laptop',
'sidebars': []
}
]
},
{
'name': '工程管理',
'url': 'http://192.168.1.100:9999/about',
'iconType': 'laptop',
'sidebars': []
}
]
}

1、定义sub-menu组件,用于递归显示多级菜单

<template functional>
<a-sub-menu :key="props.menuInfo.name" >
<span slot="title">
<a-icon type="folder" />
<span>{{ props.menuInfo.name +','+props.menuInfo.sidebars.length}}</span>
</span>
<template v-for="item in props.menuInfo.sidebars">
<a-menu-item
v-if="!item.sidebars.length"
:key="item.key">
<span>{{ item.name }}</span>
</a-menu-item>
</template>
</a-sub-menu>
</template>
<script>
export default {
name: 'SubMenu',
props: ['menuInfo']
}

不能在函数式组件里定义事件并通过@click掉用,但是可以调用父组件的事件,方法

<template functional>
<a-sub-menu :key="props.menuInfo.name" @click=parent.fetchMenu()>
...
原因是:
函数式组件没有实例,事件只能由父组件传递。

template functional标志该组件为函数化组件

2、在Mainfrm中引入组件

import SubMenu from './SubMenu'
components: {
SubMenu
}
3、menu模板

<template v-for="item in menuList">
<a-menu-item v-if="!item.sidebars.length" :key="item.name">
<a-icon :type="item.iconType" />
<span>{{item.name}}</span>
</a-menu-item>
<sub-menu v-else :menu-info="item" :key="item.name"/>
</template>

6、最终实现效果如下

 

地址:https://www.jianshu.com/p/c549c3d0f595这篇文章的递归方法点击事件显示是正常的,他这个用的是原生html元素,需要美化界面,代码如下

list: [
{
"id": "1",
"menuName": "项目管理",
"childTree": [{
"menuName": "项目进度",
"childTree": [{
"menuName": "项目一",
"childTree": [{ "menuName": "详细信息" }]
}]
}, {
"menuName": "任务安排"
}]
},
{
"id": "2",
"menuName": "数据统计"
},
{
"id": "3",
"menuName": "人员管理"
}]
// 子组件代码
<template>
<li>
<span @click="toggle">
{{ model.menuName }}
</span>
<ul v-if="isFolder" v-show="open">
<items v-for="(item, index) in model.childTree" :model="item" :key="index"></items>
</ul>
</li>
</template> <script type="text/javascript">
export default {
// 组件递归必要条件,name属性
name: 'items',
props: ['model'],
data() {
return {
// 控制子列表的显示隐藏
open: false
}
},
computed: {
// 是否还有子列表需要渲染,作为v-if的判断条件
isFolder() {
return this.model.childTree && this.model.childTree.length
}
},
methods: {
// 切换列表显示隐藏的方法
toggle() {
if(this.isFolder) {
this.open = !this.open
}
},
}
}
</script>
<template>
<div>
<ul>
<items v-for="(model, index) in list" :model="model" :key="index"></items>
</ul>
</div>
</template> <script type="text/javascript">
components: {
Items
},
data() {
return {
list: ...
}
}
</script>

AntDesign vue学习笔记(五)导航菜单动态加载的更多相关文章

  1. OpenLayers学习笔记(十)— 动态加载JSON数据模拟航迹线

    在openlayers 3 上,加载本地json数据,动态绘制航迹线,以飞机当前位置为地图中心,此例子是模拟DEMO 本文链接:动态加载JSON数据模拟航迹线 作者:狐狸家的鱼 GitHub:八至 前 ...

  2. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  3. perl学习笔记(4)——动态加载

    在写perl的时候,如果要应用到各种平台的话,比如linux 和windows,会遇到各种问题,有时就是要根据系统类型来加载各种库,之前写的就是这样的, if($^O eq 'linux'){ use ...

  4. AntDesign vue学习笔记(七)Form 读写与图片上传

    AntDesign Form使用布局相比传统Jquery有点繁琐 (一)先读写一个简单的input为例 <a-form :form="form" layout="v ...

  5. Vue学习笔记(五)——配置开发环境及初建项目

    前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...

  6. 高性能javascript学习笔记系列(1) -js的加载和执行

    这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...

  7. 【转】ViewPager学习笔记(一)——懒加载

    在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...

  8. Duilib学习笔记《07》— 资源加载

    Duilib的界面表现力能如此丰富,很大程度上得益于贴图描述的简单强大.通过之前的学习及参看相关例子,我们可以发现,在XML布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...

  9. 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作

    生成检查点文件(chekpoint file),扩展名.ckpt,tf.train.Saver对象调用Saver.save()生成.包含权重和其他程序定义变量,不包含图结构.另一程序使用,需要重新创建 ...

随机推荐

  1. html5新增表单控件和表单属性

    表单验证 Invalid事件 : 验证反馈 input.addEventListener('invalid',fn,false) 阻止默认验证:ev.preventDefault() formnova ...

  2. SpringMVC-拦截器做一个登录认证的小Demo

    拦截器 拦截器的定义 处理器拦截器类似于servlet开发中的filter,用于对处理器进行预处理和后处理. 定义拦截器,实现HandlerInterceptor这个接口 接口的实现需要导入包impo ...

  3. FCC-学习笔记 DNA Pairing

    FCC-学习笔记  DNA Pairing 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecodecamp.cn/;英 ...

  4. Django 中的缓存问题

    Django 中的缓存问题 简单介绍 ​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. ​ 当一个网站的用户访问量很大的 ...

  5. 第一部分day1-变量、运算

    变量:为了存储程序运算过程中的一些中间 结果,为了方便日后调用常量:固定不变的量,字符大写 变量的命名规则 1.字母数字下划线组成2.不能以数字开头,不能含特殊字符和空格3.不能以保留字命名4.不能以 ...

  6. 【JavaScript】内部与外部引入方式

    1.内部引入方式: script的type属性默认为"text/javascript",可以不写 <script type="text/javascript&quo ...

  7. python 多进程数量 对爬虫程序的影响

    1. 首先看一下 python 多进程的优点和缺点 多进程优点: 1.稳定性好: 多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程.基于这个特性,常常会用多进程来实现守护服务器的功 ...

  8. socket套接字及粘包问题

    socket套接字 1.什么是socket socket是一个模块,又称套接字,用来封装互联网协议(应用层以下的层) 2.为什么要有socket 实现应用层以下的层的工作,提高开发效率 3.怎么使用s ...

  9. VS 编译总是出现错误: "LC.EXE 已退出,代码为-1"

    最近在开发CS的一个项目时,编译总是出现错误: "LC.EXE 已退出,代码为-1" 解决方法一:用记事本打开*.licx,里面写的全是第三方插件的指定DLL,删除错误信息,保存, ...

  10. 虚拟机中Windows激活「很抱歉,程序无法在非MBR引导分区上进行激活」

    虚拟机激活 Windows 出现如下错误提示: 很抱歉,程序无法在非MBR引导分区上进行激活 没错,是小马Oem7F7激活工具. 最后使用 KMS 激活成功,下载链接: 链接:https://pan. ...