如何动态生成antd vue的menu组件

2023-11-03

目录

1. 需求背景:

2. 解决方案:

3. 代码示例:


 

1. 需求背景:

需要根据动态生成垂直菜单组件,数据来源的一级菜单可能包含二级子菜单,也可能不包含二级子菜单。难度在于是否包含二级子菜单决定着生成<a-menu-item>组件还是<a-sub-menu>组件,因此给开发带来难度。且vue的模板预览中v-if, v-else等条件判断不能与v-for循环出现在同级标签上。

2. 解决方案:

善用template标签,将v-for循环放在template标签,再将v-if, v-else语句判断是否包含子菜单,决定生成<a-menu-item>还是<a-sub-menu>

3. 代码示例:

template模板

<a-menu
          :default-selected-keys="['1']"
          :open-keys="openKeys"
          mode="inline"
          :selected-keys="[current]"
          @click="handleClick"
          @openChange="onOpenChange"
        >
            <template v-for="item in menus">
                <a-menu-item v-if="!item.children" :key="item.key">
                    <a-icon style="margin-right: 8px; font-size: 12px" :type="item['icon-type']" />
                    <span style="font-weight: 500; font-size: 14px">{{ item.label }}</span>
                </a-menu-item>
                <a-sub-menu v-else :key="item.key">
                    <div slot="title">
                        <ops-icon style="margin-right: 8px; font-size: 12px" :type="item['icon-type']" /><span
                            style="font-weight: 500; font-size: 14px"
                            >{{ item.label }}</span
                        >
                    </div>
                    <a-menu-item v-for="childItem in item.children" :key="childItem.key">
                        <a-icon style="margin-right: 8px; font-size: 12px" :type="childItem['icon-type']" />
                        <span style="font-weight: 500; font-size: 14px">{{ childItem.label }}</span>
                    </a-menu-item>
                </a-sub-menu>
            </template>

js代码

data() {
    return {
      collapsed: false,
      current: '1',
      rootSubmenuKeys: ['sub1', 'sub2'],
      openKeys: ['sub1'],
      menus: [
        {
          key: '1',
          'icon-type': 'zhujiqiang',
          label: '一级菜单 1',
        },
        {
          key: '2',
          'icon-type': 'zhujijiankong',
          label: '一级菜单 2',
        },
        {
          key: '3',
          'icon-type': 'wangluotuobu',
          label: '一级菜单 3',
        },
        {
          key: '4',
          'icon-type': 'wodekanban',
          label: '一级菜单 4',
        },
        {
          key: 'sub1',
          'icon-type': 'wangyexingneng',
          label: '一级菜单 5',
          children: [
            {
              key: '5',
              'icon-type': 'gailan',
              label: '二级菜单 5-1',
            },
            {
              key: '6',
              'icon-type': 'xingnengpinggu',
              label: '二级菜单 5-2',
            },
            {
              key: '7',
              'icon-type': 'yuansuxingneng',
              label: '二级菜单 5-3',
            },
          ],
        },
        {
          key: 'sub2',
          'icon-type': 'wangzhanjiankong',
          label: '二级菜单 6',
          children: [
            {
              key: '8',
              'icon-type': 'zonglan',
              label: '二级菜单 6-1',
            },
            {
              key: '9',
              'icon-type': 'shishizhuangtai',
              label: '二级菜单 6-1',
            },
            {
              key: '10',
              'icon-type': 'tongji',
              label: '二级菜单 6-1',
            },
          ],
        },
      ],
    }
methods: {
    toggleCollapsed() {
      this.collapsed = !this.collapsed
    },
    handleClick(e) {
      console.log('click ', e)
      this.current = e.key
    },
    onOpenChange(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] : []
      }
    },
  },

最终实现效果如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态生成antd vue的menu组件 的相关文章

随机推荐

  • 一些常见数学问题的算法

    代码来源 晴神 算法笔记 一 最大公约数 int gcd int a int b if b 0 return a else return gcd b a b 二 最小公倍数 lcm a b ab d ab有可能溢出 因此更恰当的写法是a d
  • IDEA的这几个调试的骚操作,用了都说爽!

    来源 https dwz cn zMaNp9Kf 一 条件断点 循环中经常用到这个技巧 比如 遍历1个大List的过程中 想让断点停在某个特定值 参考上图 在断点的位置 右击断点旁边的小红点 会出来一个界面 在Condition这里填入断点
  • Linux设置自定义命令

    哪个用户使用 就在哪个用户的目录下进行下面操作即可 例如我的用户名是cgk 1 首先进入到cgk的目录下 2 打开bashrc文件 3 将想要添加的自定义命令写入后保存即可 例 alias jup jupyter lab port 8889
  • exception is java.sql.SQLDataException: Unsupported conversion from TIMESTAMP to java.lang.Long

    org springframework dao DataIntegrityViolationException Error attempting to get column operate time from result set Caus
  • [Spring Boot]05 国内Java开发者必备的两个提速神器:Maven的国内镜像、Spring的国内脚手架

    目录 一 Maven的国内镜像 二 Spring的国内脚手架 给 Java 开发者推荐两个提速神器 一 Maven的国内镜像 Maven的国内镜像 官网地址 http maven aliyun com 配置方法很简单 只需要找到 Maven
  • Python+selenium学习

    maximize window 最大化浏览器和刷新当前页面refresh from selenium import webdriver driver webdriver Firefox driver get https www baidu
  • WordPress使用【前端投稿】功能时为用户怎么添加插入文章标签

    在使用Wordpress做前端投稿功能的时候 可能需要用户填写文章标签 在插入文章的时候很多人不知道怎么把这些标签插入进去 下面这篇文章来为大家带来WordPress使用前端投稿功能时插入文章标签方法 在Wordpress里 wp inse
  • [力扣] 剑指 Offer 07. 重建二叉树-----Java

    题目 剑指 Offer 07 重建二叉树 例子 preorder 3 9 20 15 7 inorder 9 3 15 20 7 分析 1 我们知道前序遍历 那么前序遍历的第一个数一定是根结点 也就是 3 一定是根结点 2 我们可以找到中序
  • 【JS逆向】破解xx志愿headers中u-sign加密参数

    注意 文章内容仅用于学习和技术交流 如有侵权请联系我删除 学者应洁身自好 切勿做出违法的事情 旨在提供逆向思路 aHR0cHM6Ly93d3cueW91enkuY24vdHp5L3NlYXJjaC9jb2xsZWdlcy9jb2xsZWdl
  • linux下wifi的sta和ap操作

    前言 在linux开发中wifi是很常见的一个工作 wifi有STA模式和AP模式 今天分享下如何使用工具在Linux中控制wifi 作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me 介
  • [网络安全]xss-labs level-4 解题详析

    读者可参考 订阅专栏 Xss Labs靶场攻防实战 姿势 逻辑后端代码 使用 str replace 分别将 gt 和 lt 替换为空字符串 该题使用onblur onfocus事件绕过 onblur onfocus事件 onblur 事件
  • 本地化部署大语言模型 ChatGLM

    本地化部署大语言模型 ChatGLM 本地化部署大语言模型 ChatGLM 前期筹备 GitHub 基础包 语言模型文件 基础配置 显存查看方法 Anaconda 模块 ChatGLM 6B 网页部署 Anaconda 环境创建 根目录操作
  • HTML编程之js跨域抓取问题

    对于网站建设来说 通常会需要遇到js跨域抓取的问题 那么对于初学者来说 都不知道该怎么来解决 对此 郑州网站建设公司燚轩科技就来跟大家好好的分析解答一下吧 源代码如下
  • Unix and perl primer for Biologists - Part1 :Unix - Learning the Essentials - Reading Notes(U13-U24)

    U13 Time to tidy up use the rmdir command this will only remove empty directories U14 The art of typing less to do more
  • 分页乱码问题(解决)

    上一个blog中 粗略的使用了下分页标签使用 pg使用问题还是有很多 如 分页中乱码 多java代码块下面用一个
  • CUDA Samples: Streams' usage

    以下CUDA sample是分别用C 和CUDA实现的流的使用code 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第十章 各个文件内容如下 funset cpp include funset
  • 关于示波器地线的问题!

    用信号发生器给板子输入信号 则示波器一般只能用于测试电路上某个节点和地之间的波形 如果测两个节点之间的波形 则探头上的地线可能会将地线后面其余的电路短路掉 所以 要想测两个节点间的波形 要合理的变换一下电路形式 或者做一些用于测试的附加电路
  • 以太坊的私钥、公钥、地址、账户之间的关系总结

    在以太坊中 账户 地址 私钥 Private Key 和公钥 Public Key 是非常重要的概念 账户扮演着以太坊的中心角色 地址是我们与以太坊系统进行交互的标识 它是以太坊账户与外界进行交互的名字 而私钥与公钥是保护我们账户安全的重要
  • 微搭低代码学习之数据展示

    低代码平台是一个快速发展的领域 未来有着广阔的发展前景 以下是一些低代码平台未来的发展方向 1 人工智能和机器学习 随着人工智能和机器学习技术的不断发展 低代码平台将能够更好地利用这些技术来提高应用程序的智能化和自动化水平 例如 低代码平台
  • 如何动态生成antd vue的menu组件

    目录 1 需求背景 2 解决方案 3 代码示例 1 需求背景 需要根据动态生成垂直菜单组件 数据来源的一级菜单可能包含二级子菜单 也可能不包含二级子菜单 难度在于是否包含二级子菜单决定着生成