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