Ant Design Vue 递归Menu

使用vue函数式组件创建

antdvue1.x

复制代码
Vue.component('LmSubMenu', {
    functional: true,
    render: function (createElement, context) {
        console.log(context)
        let children = [];
        context.props.menuInfo.child.forEach((item, index) => {
            if (item.child) {
                children.push(
                    createElement('lm-sub-menu', {
                        props: {menuInfo:item}
                    })
                )
            } else {
                children.push(createElement('a-menu-item', {
                    //普通html特性
                    attrs: {
                        key: item.href,
                    },
                }, item.title))
            }
        });

        return createElement('a-sub-menu', [
            createElement('span', {
                slot: 'title'
            }, [
                createElement('a-icon', {
                    //普通html特性
                    attrs: {
                        type: 'team',
                    },
                }), createElement('span', context.props.menuInfo.title)]),
            ...children
        ])
    }
})
复制代码

使用

复制代码
<a-menu
                    class="a-menu"
                    mode="inline"
                    theme="dark"
                    :inline-collapsed="collapsed">
                <template v-for="item in initinfo.menuInfo">
                    <a-menu-item v-if="!item.child" :key="item.href">
                        <a-icon type="pie-chart"></a-icon>
                        <span>{{ item.title }}</span>
                    </a-menu-item>
                    <lm-sub-menu v-else :menu-info="item"></lm-sub-menu>
                </template>
            </a-menu>
复制代码

 

 

antdvue 2.x

复制代码
/*
 * 自定义子菜单1.0.0
 *
 * 使用前必须饮用了 vue3.x.js  与  antd2.x.js
 */

var LmSubMenu = {
    name: 'LmSubMenu',
    props: {
        menuInfo: {
            type: Object,
            default: () => ({}),
        },
    },
    template: `
    <a-sub-menu>
      <template v-if="menuInfo.icon" #icon><span :class="menuInfo.icon"></span></template>
      <template #title>{{ menuInfo.title }}</template>
      <template v-for="item in menuInfo.child" :key="item.href">
          <a-menu-item v-if="!item.child" :key="item.href">
            <template v-if="item.icon" #icon><span :class="item.icon"></span></template>
            {{ item.title }}
          </a-menu-item>
          <lm-sub-menu v-else :menu-info="item"></lm-sub-menu>
      </template>
    </a-sub-menu>
  `
}
复制代码

使用

复制代码
<a-menu
                    class="a-menu"
                    mode="inline"
                    theme="dark"
                    :inline-collapsed="collapsed">
                <template v-for="item in initinfo.menuInfo">
                    <a-menu-item v-if="!item.child" :key="item.href">
                        <template v-if="item.icon" ><span :class="item.icon"></span></template>
                        <span>{{ item.title }}</span>
                    </a-menu-item>
                    <lm-sub-menu v-else :menu-info="item"></lm-sub-menu>
                </template>
            </a-menu>
复制代码

 

posted @   mingruqi  阅读(755)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2020-08-19 JRebel插件使用详解
2020-08-19 Spring配置项<context:annotation-config>的解释说明
点击右上角即可分享
微信分享提示