Tree support contextMenu
This commit is contained in:
parent
3e80a192cb
commit
888fa5c407
3 changed files with 43 additions and 3 deletions
|
@ -34,6 +34,11 @@
|
||||||
// 数值需大于 0
|
// 数值需大于 0
|
||||||
index: {
|
index: {
|
||||||
type: Number
|
type: Number
|
||||||
|
},
|
||||||
|
// 4.3.0
|
||||||
|
contextMenu: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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{
|
||||||
|
|
Loading…
Add table
Reference in a new issue