• 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>

  • 相关阅读:
    pdp部分依赖图
    Qt|使用QWebEngineView控件加载HTML使用及问题
    八大排序之堆排序
    DevOps 学习
    思科防火墙IPsec配置-野蛮模式方式(基于9.9版本)
    linux网络协议栈源码分析 - 传输层(TCP连接的建立)
    css:box-sizing使用教程
    系列六、JVM的内存结构【栈】
    Vue + element-ui 【前端项目一】Table 表格并实现分页 2
    html学习笔记
  • 原文地址:https://blog.csdn.net/hbzhlt/article/details/127898024