Tree support contextMenu

This commit is contained in:
梁灏 2020-07-02 09:16:00 +08:00
parent 3e80a192cb
commit 888fa5c407
3 changed files with 43 additions and 3 deletions

View file

@ -34,6 +34,11 @@
// 0 // 0
index: { index: {
type: Number type: Number
},
// 4.3.0
contextMenu: {
type: Boolean,
default: false
} }
}, },
data () { data () {

View file

@ -1,5 +1,5 @@
<template> <template>
<div :class="classes"> <div :class="classes" ref="tabsWrap">
<div :class="[prefixCls + '-bar']"> <div :class="[prefixCls + '-bar']">
<div :class="[prefixCls + '-nav-right']" v-if="showSlot"><slot name="extra"></slot></div> <div :class="[prefixCls + '-nav-right']" v-if="showSlot"><slot name="extra"></slot></div>
<div <div
@ -15,7 +15,7 @@
<div ref="navScroll" :class="[prefixCls + '-nav-scroll']" @DOMMouseScroll="handleScroll" @mousewheel="handleScroll"> <div ref="navScroll" :class="[prefixCls + '-nav-scroll']" @DOMMouseScroll="handleScroll" @mousewheel="handleScroll">
<div ref="nav" :class="[prefixCls + '-nav']" :style="navStyle"> <div ref="nav" :class="[prefixCls + '-nav']" :style="navStyle">
<div :class="barClasses" :style="barStyle"></div> <div :class="barClasses" :style="barStyle"></div>
<div :class="tabCls(item)" v-for="(item, index) in navList" @click="handleChange(index)" @dblclick="handleDblclick(index)"> <div :class="tabCls(item)" v-for="(item, index) in navList" @click="handleChange(index)" @dblclick="handleDblclick(index)" @contextmenu.stop="handleContextmenu(index, $event)">
<Icon v-if="item.icon !== ''" :type="item.icon"></Icon> <Icon v-if="item.icon !== ''" :type="item.icon"></Icon>
<Render v-if="item.labelType === 'function'" :render="item.label"></Render> <Render v-if="item.labelType === 'function'" :render="item.label"></Render>
<template v-else>{{ item.label }}</template> <template v-else>{{ item.label }}</template>
@ -27,6 +27,13 @@
</div> </div>
</div> </div>
<div :class="contentClasses" :style="contentStyle" ref="panes"><slot></slot></div> <div :class="contentClasses" :style="contentStyle" ref="panes"><slot></slot></div>
<div class="ivu-tabs-context-menu" :style="contextMenuStyles">
<Dropdown trigger="custom" :visible="contextMenuVisible" transfer @on-clickoutside="handleClickContextMenuOutside">
<DropdownMenu slot="list">
<slot name="contextMenu"></slot>
</DropdownMenu>
</Dropdown>
</div>
</div> </div>
</template> </template>
<script> <script>
@ -115,6 +122,11 @@
}, },
scrollable: false, scrollable: false,
transitioning: false, transitioning: false,
contextMenuVisible: false,
contextMenuStyles: {
top: 0,
left: 0
}
}; };
}, },
computed: { computed: {
@ -239,7 +251,8 @@
icon: pane.icon || '', icon: pane.icon || '',
name: pane.currentName || index, name: pane.currentName || index,
disabled: pane.disabled, disabled: pane.disabled,
closable: pane.closable closable: pane.closable,
contextMenu: pane.contextMenu
}); });
if (!pane.currentName) pane.currentName = index; if (!pane.currentName) pane.currentName = index;
if (index === 0) { if (index === 0) {
@ -302,6 +315,24 @@
if (!nav || nav.disabled) return; if (!nav || nav.disabled) return;
this.$emit('on-dblclick', nav.name); this.$emit('on-dblclick', nav.name);
}, },
handleContextmenu (index, event) {
const nav = this.navList[index];
if (!nav || nav.disabled || !nav.contextMenu) return;
event.preventDefault();
const $TabsWrap = this.$refs.tabsWrap;
const TabsBounding = $TabsWrap.getBoundingClientRect();
const position = {
left: `${event.clientX - TabsBounding.left}px`,
top: `${event.clientY - TabsBounding.top}px`
};
this.contextMenuStyles = position;
this.contextMenuVisible = true;
this.$emit('on-contextmenu', nav, event, position);
},
handleClickContextMenuOutside () {
this.contextMenuVisible = false;
},
handleTabKeyNavigation(e){ handleTabKeyNavigation(e){
if (e.keyCode !== 37 && e.keyCode !== 39) return; if (e.keyCode !== 37 && e.keyCode !== 39) return;
const direction = e.keyCode === 39 ? 1 : -1; const direction = e.keyCode === 39 ? 1 : -1;

View file

@ -232,6 +232,10 @@
transform: translateZ(0); transform: translateZ(0);
margin-right: -6px; margin-right: -6px;
} }
&-context-menu{
position: absolute;
}
} }
.@{tabs-prefix-cls}-no-animation{ .@{tabs-prefix-cls}-no-animation{