index.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import contextMenuVue from './src/index';
  2. import { isClient } from '/@/utils/is';
  3. import { Options, Props } from './src/types';
  4. import { createVNode, render } from 'vue';
  5. const menuManager: {
  6. domList: Element[];
  7. resolve: Fn;
  8. } = {
  9. domList: [],
  10. resolve: () => {},
  11. };
  12. export const createContextMenu = function (options: Options) {
  13. const { event } = options || {};
  14. try {
  15. event.preventDefault();
  16. } catch (e) {
  17. console.log(e);
  18. }
  19. if (!isClient) return;
  20. return new Promise((resolve) => {
  21. const container = document.createElement('div');
  22. const propsData: Partial<Props> = {};
  23. if (options.styles !== undefined) propsData.styles = options.styles;
  24. if (options.items !== undefined) propsData.items = options.items;
  25. if (options.event !== undefined) {
  26. propsData.customEvent = event;
  27. propsData.axis = { x: event.clientX, y: event.clientY };
  28. }
  29. const vm = createVNode(contextMenuVue, propsData);
  30. render(vm, container);
  31. const bodyClick = function () {
  32. menuManager.resolve('');
  33. };
  34. menuManager.domList.push(container);
  35. const remove = function () {
  36. menuManager.domList.forEach((dom: Element) => {
  37. try {
  38. document.body.removeChild(dom);
  39. } catch (error) {}
  40. });
  41. document.body.removeEventListener('click', bodyClick);
  42. document.body.removeEventListener('scroll', bodyClick);
  43. };
  44. menuManager.resolve = function (...arg: any) {
  45. resolve(arg[0]);
  46. remove();
  47. };
  48. remove();
  49. document.body.appendChild(container);
  50. document.body.addEventListener('click', bodyClick);
  51. document.body.addEventListener('scroll', bodyClick);
  52. });
  53. };
  54. export const unMountedContextMenu = function () {
  55. if (menuManager) {
  56. menuManager.resolve('');
  57. menuManager.domList = [];
  58. }
  59. };
  60. export * from './src/types';