Dropdown.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import type { Trigger } from './types';
  2. import { defineComponent, computed, unref } from 'vue';
  3. import { Dropdown, Menu } from 'ant-design-vue';
  4. import Icon from '/@/components/Icon/index';
  5. import { basicDropdownProps } from './props';
  6. import { getSlot } from '/@/utils/helper/tsxHelper';
  7. export default defineComponent({
  8. name: 'Dropdown',
  9. props: basicDropdownProps,
  10. emits: ['menuEvent'],
  11. setup(props, { slots, emit, attrs }) {
  12. const getMenuList = computed(() => props.dropMenuList);
  13. function handleClickMenu({ key }: any) {
  14. const menu = unref(getMenuList).find((item) => `${item.event}` === `${key}`);
  15. emit('menuEvent', menu);
  16. }
  17. function renderMenus() {
  18. return (
  19. <Menu onClick={handleClickMenu} selectedKeys={props.selectedKeys}>
  20. {() => (
  21. <>
  22. {unref(getMenuList).map((item) => {
  23. const { disabled, icon, text, divider, event } = item;
  24. return [
  25. <Menu.Item key={`${event}`} disabled={disabled}>
  26. {() => (
  27. <>
  28. {icon && <Icon icon={icon} />}
  29. <span class="ml-1">{text}</span>
  30. </>
  31. )}
  32. </Menu.Item>,
  33. // @ts-ignore
  34. divider && <Menu.Divider key={`d-${event}`} />,
  35. ];
  36. })}
  37. </>
  38. )}
  39. </Menu>
  40. );
  41. }
  42. return () => (
  43. <Dropdown trigger={props.trigger as Trigger[]} {...attrs}>
  44. {{
  45. default: () => <span>{getSlot(slots)}</span>,
  46. overlay: () => renderMenus(),
  47. }}
  48. </Dropdown>
  49. );
  50. },
  51. });