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

  • 相关阅读:
    C++ 【类和对象: 析构函数,拷贝构造函数,运算符重载 --2】
    基于ThinkPHP5+MySQL的超市进销存管理系统
    多通道图片的卷积过程
    Android中几种常见的播放声音组件
    浏览器安全级别怎么设置,设置浏览器安全级别的方法
    0829(041天 大数据01 概论)
    3数据库系统——软件设计师
    性能测试【第三篇】Jmeter的使用
    景联文科技:深度了解语音识别之发音词典及语音数据采集标注
    React Redux
  • 原文地址:https://blog.csdn.net/hbzhlt/article/details/127898024