Ant Design Vue如何生成动态菜单a-menu

 更新时间:2024年01月03日 14:44:37   作者:轻叹年华逝,  
这篇文章主要介绍了Ant Design Vue如何生成动态菜单a-menu问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

今天,小编带你们看一看从官网总结来得动态菜单

一、定义template模板

<template>
    <a-layout>
        <!-- 左侧导航 -->
        <a-layout-sider>
            <div>
                <a-menu
                    :inlineIndent="inlineIndent"   		菜单缩进
                    :defaultSelectedKeys="[$route.path]"  		默认选中的节点
                    :openKeys="openKeys"    		展开的节点
                    mode="inline"   		菜单模式
                    :inline-collapsed="collapsed"  		折叠方式
                    @openChange="onOpenChange"
                    @click="menuClick">
                    <!-- 菜单遍历的开始 -->
                    <template v-for="item in menuList">
                        <!-- 如果当前遍历项没有children,视为子菜单项,注意所有的key都是path用于路由跳转,以及当前选中记录 -->
                        <a-menu-item v-if="!item.children" :key="item.menu_url">
                            <i :class="item.menu_icon" style="font-size:18px;margin-right:5px"/>
                            <span style="font-size: 15px;">{{ item.menu_name }}</span>
                        </a-menu-item>
                        <!-- 否则视为子菜单,传入菜单信息并且运用下面定义的函数式组件 -->
                        <sub-menu v-else :key="item.menu_url" :menu-info="item" />
                    </template>
                </a-menu>
            </div>
        </a-layout-sider>
        <!-- 内容 -->
        <a-layout-content>
            <router-view></router-view>
        </a-layout-content>
      </a-layout>
</template>

二、定义函数式组件

// 定义函数式组件
const SubMenu = {
  template: `
    <a-sub-menu :key="menuInfo.menu_url" v-bind="$props" v-on="$listeners">
        <span slot="title">
          <i class="iconfont iconshezhiziduan" v-if="menuInfo.menu_name=='系统管理'" style="font-size:18px;margin-right:5px"/>
          <span style="font-size: 15px;">{{ menuInfo.menu_name }}</span>
        </span>
        <template v-for="item in menuInfo.children">
          <a-menu-item v-if="!item.children" :key="item.menu_url">
            <i :class="item.menu_icon" style="font-size:18px;margin-right:5px"/>
            <span style="font-size: 15px;">{{ item.menu_name }}</span>
          </a-menu-item>
          <sub-menu v-else :key="item.menu_url" :menu-info="item" />
        </template>
    </a-sub-menu>
    `,

三、引入菜单组件及接受动态菜单数据

import { Menu } from 'ant-design-vue';

name: 'SubMenu',
// true 此项必须被定义
isSubMenu: true,
props: {
  // 解构a-sub-menu的属性,也就是文章开头提到的为什么使用函数式组件
  ...Menu.SubMenu.props,
  // 接收父级传递过来的菜单信息
  menuInfo: {
    type: Object,
    default: () => ({}),
  },
},

动态菜单数据格式如下:

// 菜单数据
menuList: [
    {
        key:'1',
        title: '系统信息管理',
        path: '/system_infomation_manage',
        icon:'iconfont iconshezhiziduan',
        children: [
            {
                key:'2',
                title: '项目信息管理',
                path: '/system_base/system_information',
                icon:''
            },
            {
                key:'3',
                title: '系统组织机构管理',
                path: '/system_base/institul_framework',
                icon:''
            },
            {
                key:'4',
                title: '系统人员管理',
                path: '/system_base/personnel_manage',
                icon:''
            },
            {
                key:'5',
                title: '系统权限管理',
                path: '/system_base/jurisdiction_manage',
                icon:''
            },
            {
                key:'6',
                title:'项目业务字典管理',
                path:'/system_dictionary_management',
                icon:'',
                children:[
                    {
                        key:'6_1',
                        title:'材料设备管理',
                        path:'/dictionary_material_manage',
                        icon:'',
                        children:[
                            {
                                key:'6_1_1',
                                title:'材料管理',
                                path:'/system_base/material_manage',
                                icon:'',
                            },
                            {
                                key:'6_1_2',
                                title:'机械设备管理',
                                path:'/system_base/machine_manage',
                                icon:'',
                            }
                        ]
                    }
                ]
            }
        ]
    }
],

四、定义其他数据

// 菜单缩进
inlineIndent:12,
// 默认不折叠
collapsed: false,
// 全部父节点
rootSubmenuKeys: ['/system_infomation_manage'],
openKeys: [],//默认展开的节点
defaultOpenKeys:['/system_infomation_manage'],
// 选中的子菜单项
defaultSelectedKeys: [this.$route.path], 

五、所涉及到的方法

methods:{
	//  控制只打开一个
	onOpenChange(openKeys) {
	      // 将当前打开的父级菜单存入缓存中
	    window.localStorage.setItem('systemOpenKeys', JSON.stringify(openKeys))
	    const latestOpenKey = openKeys.find(key => this.openKeys.indexOf(key) === -1);
	    if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
	        this.openKeys = openKeys;
	    } else {
	        this.openKeys = latestOpenKey ? [latestOpenKey] : [];
	    }
	},
	// 点击菜单,路由跳转,注意的是当点击MenuItem才会触发此函数
	menuClick({ item, key, keyPath }) {
	    // 获取到当前的key,并且跳转
	    this.$router.push({
	        path: key
	    })
	},
},
created(){
    // 将从缓存中取出openKeys
    const openKeys = window.localStorage.getItem('systemOpenKeys')
    if(openKeys){
        // 存在即赋值
        this.openKeys = JSON.parse(openKeys)
    }else{
        this.openKeys = ['/system_infomation_manage']
    }
    this.getSystemPermission()
},

这样,一个完整的动态菜单就渲染出来了,最重要的一步就是定义函数式组件,这也是Vue和React框架的重要思想之一。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • vue 路由跳转四种方式实践案例 (带参数)

    vue 路由跳转四种方式实践案例 (带参数)

    本文详细介绍了Vue中通过$router对象实现的四种路由跳转方法:router-link的使用、this.$router.push()和this.$router.replace(),以及参数传递的query与params区别,感兴趣的朋友跟随小编一起看看吧
    2025-05-05
  • 解决Vue @submit 提交后不刷新页面问题

    解决Vue @submit 提交后不刷新页面问题

    这篇文章主要介绍了解决Vue @submit 提交后不刷新页面问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue实现路由传参的四种方式

    Vue实现路由传参的四种方式

    在单页应用里,路由是连接页面与数据的桥梁,Vue Router 提供了四种方式把「参数」从地址栏、内存甚至编译期注入到组件,理解它们的差异,才能在面试和线上故障中游刃有余,下面小编为大家详细介绍一下
    2025-09-09
  • Vue使用Element折叠面板Collapse如何设置默认全部展开

    Vue使用Element折叠面板Collapse如何设置默认全部展开

    这篇文章主要介绍了Vue使用Element折叠面板Collapse如何设置默认全部展开,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue中v-model如何绑定多循环表达式实战案例

    vue中v-model如何绑定多循环表达式实战案例

    v-model绑定的变量无论是对象还是数组都是绑定的value值,下面这篇文章主要给大家介绍了关于vue中v-model如何绑定多循环表达式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue上传图片文件的多种实现方法

    vue上传图片文件的多种实现方法

    这篇文章主要给大家介绍了关于vue上传图片文件的相关资料,介绍了利用原始input标签form表单上传、elementui自带的el-upload上传以及elementui实现一次性上传多张图片等方法,需要的朋友可以参考下
    2021-05-05
  • 使用Vue.js开发微信小程序开源框架mpvue解析

    使用Vue.js开发微信小程序开源框架mpvue解析

    这篇文章主要介绍了使用Vue.js开发微信小程序开源框架mpvue解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Vue自定义指令实现点击右键弹出菜单示例详解

    Vue自定义指令实现点击右键弹出菜单示例详解

    这篇文章主要为大家介绍了Vue自定义指令实现点击右键弹出菜单示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • vuex中store.commit和store.dispatch的区别及使用方法

    vuex中store.commit和store.dispatch的区别及使用方法

    这篇文章主要介绍了vuex中store.commit和store.dispatch的区别及使用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 深入对Vue.js $watch方法的理解

    深入对Vue.js $watch方法的理解

    本篇文章主要介绍了深入对Vue.js $watch方法的理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2017-03-03

最新评论