index.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <transition name="el-zoom-in-center">
  3. <div
  4. aria-hidden="true"
  5. class="el-dropdown__popper el-popper is-light is-pure custom-contextmenu"
  6. role="tooltip"
  7. data-popper-placement="bottom"
  8. :style="`top: ${dropdowns.y + 5}px;left: ${dropdowns.x}px;`"
  9. :key="Math.random()"
  10. v-show="isShow"
  11. >
  12. <ul class="el-dropdown-menu">
  13. <li
  14. v-for="(v, k) in dropdownList"
  15. class="el-dropdown-menu__item"
  16. aria-disabled="false"
  17. tabindex="-1"
  18. :key="k"
  19. @click="onCurrentClick(v.contextMenuClickId)"
  20. >
  21. <SvgIcon :name="v.icon" />
  22. <span>{{ v.txt }}{{ item.type === 'line' ? '线' : '节点' }}</span>
  23. </li>
  24. </ul>
  25. <div class="el-popper__arrow" style="left: 10px"></div>
  26. </div>
  27. </transition>
  28. </template>
  29. <script lang="ts">
  30. import { computed, defineComponent, reactive, toRefs, onMounted, onUnmounted } from 'vue';
  31. export default defineComponent({
  32. name: 'pagesWorkflowContextmenu',
  33. props: {
  34. dropdown: {
  35. type: Object,
  36. },
  37. },
  38. setup(props, { emit }) {
  39. const state = reactive({
  40. isShow: false,
  41. dropdownList: [
  42. { contextMenuClickId: 0, txt: '删除', icon: 'ele-Delete' },
  43. { contextMenuClickId: 1, txt: '编辑', icon: 'ele-Edit' },
  44. ],
  45. item: {
  46. type: 'node',
  47. },
  48. conn: {},
  49. });
  50. // 父级传过来的坐标 x,y 值
  51. const dropdowns = computed(() => {
  52. return <any>props.dropdown;
  53. });
  54. // 当前项菜单点击
  55. const onCurrentClick = (contextMenuClickId: number) => {
  56. emit('current', Object.assign({}, { contextMenuClickId }, state.item), state.conn);
  57. };
  58. // 打开右键菜单:判断是否固定,固定则不显示关闭按钮
  59. const openContextmenu = (item: any, conn = {}) => {
  60. state.item = item;
  61. state.conn = conn;
  62. closeContextmenu();
  63. setTimeout(() => {
  64. state.isShow = true;
  65. }, 10);
  66. };
  67. // 关闭右键菜单
  68. const closeContextmenu = () => {
  69. state.isShow = false;
  70. };
  71. // 监听页面监听进行右键菜单的关闭
  72. onMounted(() => {
  73. document.body.addEventListener('click', closeContextmenu);
  74. document.body.addEventListener('contextmenu', closeContextmenu);
  75. });
  76. // 页面卸载时,移除右键菜单监听事件
  77. onUnmounted(() => {
  78. document.body.removeEventListener('click', closeContextmenu);
  79. document.body.removeEventListener('contextmenu', closeContextmenu);
  80. });
  81. return {
  82. dropdowns,
  83. openContextmenu,
  84. closeContextmenu,
  85. onCurrentClick,
  86. ...toRefs(state),
  87. };
  88. },
  89. });
  90. </script>
  91. <style scoped lang="scss">
  92. .custom-contextmenu {
  93. transform-origin: center top;
  94. z-index: 2190;
  95. position: fixed;
  96. .el-dropdown-menu__item {
  97. font-size: 12px !important;
  98. white-space: nowrap;
  99. i {
  100. font-size: 12px !important;
  101. }
  102. }
  103. }
  104. </style>