• AntDesignVue动态创建下拉菜单


    最近项目需要,有需要动态创建下拉菜单的需求,特此记录一下。

    vue版本:3.1.4

    ant-design-vue版本:2.1.6

    需求是下拉菜单项可以根据配置来控制是否显示,那么就需要用到 v-for 和 v-if 的结合。

    v-for 和 v-if 是不能同时应用到元素上面的,所以需要用 template 来承载 v-for,代码如下:

    1. <a-dropdown v-if="moreButtons.length > 0">
    2. <a-button type="primary" @click.prevent>a-button>
    3. <template #overlay>
    4. <a-menu @click="dropdownMenuItemClick">
    5. <template v-for="controlItem in moreButtons">
    6. <a-menu-item v-if="controlItem.show" :key="controlItem.name">
    7. {{ controlItem.text }}
    8. a-menu-item>
    9. template>
    10. a-menu>
    11. template>
    12. a-dropdown>

    下面的写法也是可以的,v-if 也放到一个单独的template中

    1. <a-dropdown v-if="moreButtons.length > 0">
    2. <a-button type="primary" @click.prevent>a-button>
    3. <template v-for="controlItem in moreButtons">
    4. <template v-if="controlItem.show">
    5. <a-menu-item :key="controlItem.name">{{ controlItem.text }}a-menu-item>
    6. template>
    7. template>
    8. a-dropdown>

    需要注意的一点,如果是结合 v-if 判断的话,key 一定要绑定在 a-menu-item 元素上!!!

    如下面的代码,虽然可以正常动态显示菜单,但是在点击菜单项项的时候,拿到的 key 都是0。

    1. <a-dropdown v-if="moreButtons.length > 0">
    2. <a-button type="primary" @click.prevent>a-button>
    3. <template #overlay>
    4. <a-menu @click="dropdownMenuItemClick">
    5. <template v-for="controlItem in moreButtons" :key="controlItem.name">
    6. <a-menu-item v-if="controlItem.show">{{ controlItem.text }}a-menu-item>
    7. template>
    8. a-menu>
    9. template>
    10. a-dropdown>

    分别点了“按钮1”和“按钮3”,输出的key都是0

     正常应该是点击哪一个按钮,就输出哪一个按钮的key。

    如下:

    点击“按钮1”,输出的key是 “button1”

    点击“按钮3”,输出的key是 “button3”

    如果不需要结合 v-if 判断的话,key可以绑定在template上;或者直接去掉template,在a-menu-item上直接 v-for

    部分代码如下:

    1. <a-dropdown
    2. v-if="contextMenuItems.length > 0 || moreContextMenuItems.length > 0"
    3. :trigger="['contextmenu']"
    4. >
    5. <template #overlay>
    6. <a-menu @click="contextMenuItemClick">
    7. <a-menu-item v-for="menuItem in contextMenuItems" :key="menuItem.name">
    8. {{ menuItem.text }}
    9. a-menu-item>
    10. <a-sub-menu v-if="moreContextMenuItems.length > 0" key="moreMenus" title="更多...">
    11. <template v-for="menuItem in moreContextMenuItems" :key="menuItem.name">
    12. <a-menu-item>{{ menuItem.text }}a-menu-item>
    13. template>
    14. a-sub-menu>
    15. a-menu>
    16. template>
    17. a-dropdown>

    完整代码如下:

    1. <template>
    2. <a-dropdown v-if="moreButtons.length > 0">
    3. <a-button type="primary" @click.prevent>a-button>
    4. <template v-for="controlItem in moreButtons">
    5. <a-menu-item v-if="controlItem.show" :key="controlItem.name">
    6. {{ controlItem.text }}
    7. a-menu-item>
    8. template>
    9. a-dropdown>
    10. template>

  • 相关阅读:
    【7.21-26】代码源 - 【平方计数】【字典序最小】【“Z”型矩阵】
    腾讯云COS+Picgo+Typora图床搭建
    智汇华云 | 集群日志动态采集方案
    口袋参谋:如何通过布局“问大家”,快速提高宝贝转化!
    [网络工程师]-应用层协议-电子邮件协议
    Python中日志异步发送到远程服务器
    常用的gpt网站
    Linux入门---页表的理解
    汪子熙趣味成语接龙的游戏软件使用文档说明
    Vue驾校-从项目学Vue-6
  • 原文地址:https://blog.csdn.net/hbzhlt/article/details/127898024