Contextmenu.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <a-menu :style="style" class="contextmenu" v-show="visible" @click="handleClick" :selectedKeys="selectedKeys">
  3. <a-menu-item :key="item.key" v-for="item in itemList">
  4. <a-icon role="menuitemicon" v-if="item.icon" :type="item.icon" />{{ item.text }}
  5. </a-menu-item>
  6. </a-menu>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'Contextmenu',
  11. props: {
  12. visible: {
  13. type: Boolean,
  14. required: false,
  15. default: false
  16. },
  17. itemList: {
  18. type: Array,
  19. required: true,
  20. default: () => []
  21. }
  22. },
  23. data () {
  24. return {
  25. left: 0,
  26. top: 0,
  27. target: null,
  28. selectedKeys: []
  29. }
  30. },
  31. computed: {
  32. style () {
  33. return {
  34. left: this.left + 'px',
  35. top: this.top + 'px'
  36. }
  37. }
  38. },
  39. created () {
  40. window.addEventListener('mousedown', e => this.closeMenu(e))
  41. window.addEventListener('contextmenu', e => this.setPosition(e))
  42. },
  43. methods: {
  44. closeMenu (e) {
  45. // 打开新标签页
  46. if(e.target.href&&e.target.href.indexOf('/interLock/dashboard')>=0){
  47. var data = e.target.href.split(')=(')
  48. var url = data[1].split('?')
  49. var params = url[1].split('&')
  50. // console.log("可视化", url[0] + "?" + params[0] + "&" + params[1] + "&" + params[2] + "&" + params[3] + "&var-Group=" + encodeURI(sessionStorage.getItem("VAR_GROUP")) + "&var-system=" + encodeURI(sessionStorage.getItem("VAR_SYSTEM")))
  51. window.open(url[0] + "?" + params[0] + "&" + params[1] + "&" + params[2] + "&" + params[3] + "&var-Group=" + encodeURI(sessionStorage.getItem("VAR_GROUP")) + "&var-system=" + encodeURI(sessionStorage.getItem("VAR_SYSTEM")), '_blank')
  52. }
  53. if (this.visible === true && ['menuitemicon', 'menuitem'].indexOf(e.target.getAttribute('role')) < 0) {
  54. this.$emit('update:visible', false)
  55. }
  56. },
  57. setPosition (e) {
  58. this.left = e.clientX
  59. this.top = e.clientY
  60. this.target = e.target
  61. },
  62. handleClick ({key}) {
  63. this.$emit('select', key, this.target)
  64. this.$emit('update:visible', false)
  65. }
  66. }
  67. }
  68. </script>
  69. <style lang="less" scoped>
  70. .contextmenu{
  71. position: fixed;
  72. z-index: 1;
  73. border: 1px solid #9e9e9e;
  74. border-radius: 4px;
  75. box-shadow: 2px 2px 10px #aaaaaa !important;
  76. }
  77. </style>