Dropdown.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <a-dropdown :trigger="trigger" v-bind="$attrs">
  3. <span>
  4. <slot></slot>
  5. </span>
  6. <template #overlay>
  7. <a-menu :selectedKeys="selectedKeys">
  8. <template v-for="item in dropMenuList" :key="`${item.event}`">
  9. <a-menu-item
  10. v-bind="getAttr(item.event)"
  11. @click="handleClickMenu(item)"
  12. :disabled="item.disabled"
  13. >
  14. <Popconfirm v-if="popconfirm" v-bind="item">
  15. <Icon :icon="item.icon" v-if="item.icon" />
  16. <span class="ml-1">{{ item.text }}</span>
  17. </Popconfirm>
  18. <template v-else>
  19. <Icon :icon="item.icon" v-if="item.icon" />
  20. <span class="ml-1">{{ item.text }}</span>
  21. </template>
  22. </a-menu-item>
  23. <a-menu-divider v-if="item.divider" :key="`d-${item.event}`" />
  24. </template>
  25. </a-menu>
  26. </template>
  27. </a-dropdown>
  28. </template>
  29. <script lang="ts">
  30. import type { PropType } from 'vue';
  31. import type { DropMenu } from './types';
  32. import { defineComponent } from 'vue';
  33. import { Dropdown, Menu, Popconfirm } from 'ant-design-vue';
  34. import { Icon } from '/@/components/Icon';
  35. export default defineComponent({
  36. name: 'BasicDropdown',
  37. components: {
  38. [Dropdown.name]: Dropdown,
  39. [Menu.name]: Menu,
  40. [Menu.Item.name]: Menu.Item,
  41. [Menu.Divider.name]: Menu.Divider,
  42. Icon,
  43. Popconfirm,
  44. },
  45. props: {
  46. popconfirm: Boolean,
  47. /**
  48. * the trigger mode which executes the drop-down action
  49. * @default ['hover']
  50. * @type string[]
  51. */
  52. trigger: {
  53. type: [Array] as PropType<string[]>,
  54. default: () => {
  55. return ['contextmenu'];
  56. },
  57. },
  58. dropMenuList: {
  59. type: Array as PropType<DropMenu[]>,
  60. default: () => [],
  61. },
  62. selectedKeys: {
  63. type: Array as PropType<string[]>,
  64. default: () => [],
  65. },
  66. },
  67. emits: ['menuEvent'],
  68. setup(props, { emit }) {
  69. function handleClickMenu(item: DropMenu) {
  70. const { event } = item;
  71. const menu = props.dropMenuList.find((item) => `${item.event}` === `${event}`);
  72. emit('menuEvent', menu);
  73. item.onClick?.();
  74. }
  75. return {
  76. handleClickMenu,
  77. getAttr: (key: string | number) => ({ key }),
  78. };
  79. },
  80. });
  81. </script>