feat: add contextmenu for page tab #25
parent
366575e8f6
commit
e7f1540c04
2 changed files with 153 additions and 16 deletions
@ -0,0 +1,75 @@ |
|||||||
|
<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> |
||||||
|
import AMenu from 'ant-design-vue/es/menu/index' |
||||||
|
import AIcon from 'ant-design-vue/es/icon/icon' |
||||||
|
const AMenuItem = AMenu.Item |
||||||
|
export default { |
||||||
|
name: 'Contextmenu', |
||||||
|
components: {AIcon, AMenuItem, AMenu}, |
||||||
|
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 (['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; |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue