3110556be29636c884d7026331076f3b707da9e1.svn-base 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. if (this.visible === true && ['menuitemicon', 'menuitem'].indexOf(e.target.getAttribute('role')) < 0) {
  46. this.$emit('update:visible', false)
  47. }
  48. },
  49. setPosition (e) {
  50. this.left = e.clientX
  51. this.top = e.clientY
  52. this.target = e.target
  53. },
  54. handleClick ({key}) {
  55. this.$emit('select', key, this.target)
  56. this.$emit('update:visible', false)
  57. }
  58. }
  59. }
  60. </script>
  61. <style lang="less" scoped>
  62. .contextmenu{
  63. position: fixed;
  64. z-index: 1;
  65. border: 1px solid #9e9e9e;
  66. border-radius: 4px;
  67. box-shadow: 2px 2px 10px #aaaaaa !important;
  68. }
  69. </style>