其他分享
首页 > 其他分享> > antdv 使用单文件方式递归生成菜单

antdv 使用单文件方式递归生成菜单

作者:互联网

antv生成多级菜单代码如下

<template>
    <a-menu mode="inline" :defaultSelectedKeys="['child00']" :openKeys="openKeys"
                    @openChange="onOpenChange" >
                    <template v-for='(item,index) in leftMenuData'>
                        <a-menu-item v-if="!item.children" :key='"main"+index' @click='clickMenuTitle(item)'>
                            <span>{{ item.name }}</span>
                        </a-menu-item>
                        <sub-menu v-else :key='"main0"+index' :menu-info="item" />
                    </template>
                </a-menu>

</template>
<script>
  
import SubMenu from "@c/subMenu/Index.vue"; 
data(){
     return {
            leftMenuData: [
                {
                    name: '项目及常用代码', path: '1', icon: 'setting', children: [
                        { name: '项目列表', path: 'projectList' },
                    ]
                },
                {
                    name: '组件封装', path: '2', icon: 'setting', children: [
                        {name: '图表组件', path: '2-1', icon: 'setting', children: [
                            { name: '雷达图', path: 'radar' },]
                        },
                        {name: '组件封装', path: '2-2', icon: 'setting', children: [
                            {name:'卡片',path:'cardShow',icon:'setting',}]
                        }
                    ]
                },
            ],
    }
} 

methods: {
    clickMenuTitle(item, element) {//路由跳转,面包屑设置
            if (element && element.path !== '' || item.path !== '') {
                this.$router.push({ name: element ? element.path : item.path });
            } else {
                this.$message.error('快马加班赶制中!')
            }
            this.reload();
   },
//点击菜单可以刷新当前页面
        reload() {
            this.isRouterAlive = false
            this.$nextTick(() => (this.isRouterAlive = true))
        }
}
 
</script>

 

  子菜单的代码如下

 1 <!-- 子菜单 -->
 2 <template>
 3     <a-sub-menu :key="menuInfo.path" v-bind="$props" v-on="$listeners">
 4         <span slot="title">
 5             <a-icon :type="menuInfo.icon" /><span>{{ menuInfo.name }}</span>
 6         </span>
 7         <template v-for="item in menuInfo.children">
 8             <a-menu-item v-if="!item.children" :key="item.path || item.name" @click='clickMenuTitle(item,element)'>
 9                 <!-- <a-icon type="pie-chart" /> -->
10                 <span>{{ item.name }}</span>
11             </a-menu-item>
12             <sub-menu v-else :key="item.path" :menu-info="item" />
13         </template>
14 
15     </a-sub-menu>
16 </template>
17 
18 <script>
19 import { Menu } from 'ant-design-vue';
20 export default {
21     name: 'SubMenu',
22 // 必须添加
23     isSubMenu: true,
24     props:{
25         ...Menu.SubMenu.props,
26         menuInfo: {
27             type: Object,
28             default: () => ({}),
29         },
30     },
31     //监听属性 类似于data概念
32     computed: {},
33     //监控data中的数据变化
34     watch: {},
35     
36     methods: {
37         clickMenuTitle(item, element) {//路由跳转,面包屑设置
38             if (element && element.path !== '' || item.path !== '') {
39                 this.$router.push({ name: element ? element.path : item.path });
40             } else {
41                 this.$message.error('快马加班赶制中!')
42             }
43             this.reload();
44         },
45     },
46     
47 }
48 </script>
49

 

标签:菜单,antdv,name,递归,element,item,setting,path,icon
来源: https://www.cnblogs.com/sllzhj/p/14182987.html