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
| <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;
| border: 1px solid #9e9e9e;
| border-radius: 4px;
| box-shadow: 2px 2px 10px #aaaaaa !important;
| }
| </style>
|
|