1
+ <!--
1
2
<template>
2
3
<div style="margin: -23px -24px 24px -24px">
4
+ <!–<a-dropdown :trigger="['contextmenu']" overlayClassName="multi-tab-menu-wrapper">
5
+ <a-menu slot="overlay">
6
+ <a-menu-item key="1">1st menu item</a-menu-item>
7
+ <a-menu-item key="2">2nd menu item</a-menu-item>
8
+ <a-menu-item key="3">3rd menu item</a-menu-item>
9
+ </a-menu>
10
+ </a-dropdown>–>
3
11
<a-tabs
4
12
hideAdd
5
13
v-model="activeKey"
9
17
>
10
18
<a-tab-pane v-for="page in pages" :style="{ height: 0 }" :tab="page.meta.title" :key="page.fullPath" :closable="pages.length > 1">
11
19
</a-tab-pane>
20
+ <template slot="renderTabBar" slot-scope="props, DefaultTabBar">
21
+ <component :is="DefaultTabBar" {...props} />
22
+ </template>
12
23
</a-tabs>
13
24
</div>
14
25
</template>
26
+ -->
15
27
16
28
<script >
17
29
export default {
@@ -27,16 +39,81 @@ export default {
27
39
created () {
28
40
this .pages .push (this .$route )
29
41
this .fullPathList .push (this .$route .fullPath )
42
+ this .selectedLastPath ()
30
43
},
31
44
methods: {
32
45
onEdit (targetKey , action ) {
46
+ console .log (' onEdit' , targetKey, action)
33
47
this [action](targetKey)
34
48
},
35
49
remove (targetKey ) {
36
50
this .pages = this .pages .filter (page => page .fullPath !== targetKey)
37
51
this .fullPathList = this .fullPathList .filter (path => path !== targetKey)
38
52
// 跳转到最后一个还存在的标签页
53
+ this .selectedLastPath ()
54
+ },
55
+ selectedLastPath () {
39
56
this .activeKey = this .fullPathList [this .fullPathList .length - 1 ]
57
+ },
58
+
59
+ // content menu
60
+ closeThat (e ) {
61
+ console .log (' close that' , e)
62
+ this .remove (e)
63
+ },
64
+ closeLeft (e ) {
65
+ // TODO
66
+ console .log (' close left' , e)
67
+ const index = this .fullPathList .indexOf (e)
68
+ if (index > - 1 ) {
69
+ this .fullPathList .splice (index, - 1 )
70
+ }
71
+ },
72
+ closeRight (e ) {
73
+ console .log (' close right' , e)
74
+ },
75
+ closeAll (e ) {
76
+ console .log (' close all' , e)
77
+ },
78
+ closeMenuClick ({ key, item, domEvent }) {
79
+ console .log (' key' , key)
80
+ console .log (' item' , item .$attrs [' data-vkey' ])
81
+ const vkey = domEvent .target .getAttribute (' data-vkey' )
82
+ switch (key) {
83
+ case ' close-right' :
84
+ this .closeRight (vkey)
85
+ break
86
+ case ' close-left' :
87
+ this .closeLeft (vkey)
88
+ break
89
+ case ' close-all' :
90
+ this .closeAll (vkey)
91
+ break
92
+ default :
93
+ case ' close-that' :
94
+ this .closeThat (vkey)
95
+ break
96
+ }
97
+ },
98
+ renderTabPaneMenu (e ) {
99
+ return (
100
+ < a- menu {... { on: { click: this .closeMenuClick } }}>
101
+ < a- menu- item key= " close-that" data- vkey= {e}> 关闭当前标签< / a- menu- item>
102
+ < a- menu- item key= " close-right" data- vkey= {e}> 关闭右侧< / a- menu- item>
103
+ < a- menu- item key= " close-left" data- vkey= {e}> 关闭左侧< / a- menu- item>
104
+ < a- menu- item key= " close-all" data- vkey= {e}> 关闭全部< / a- menu- item>
105
+ < / a- menu>
106
+ )
107
+ },
108
+ // render
109
+ renderTabPane (title , keyPath ) {
110
+ const menu = this .renderTabPaneMenu (keyPath)
111
+
112
+ return (
113
+ < a- dropdown overlay= {menu} trigger= {[' contextmenu' ]}>
114
+ < span style= {{ userSelect: ' none' }}> { title }< / span>
115
+ < / a- dropdown>
116
+ )
40
117
}
41
118
},
42
119
watch: {
@@ -48,8 +125,28 @@ export default {
48
125
}
49
126
},
50
127
activeKey : function (newPathKey ) {
128
+ console .log (' activeKey' , newPathKey)
51
129
this .$router .push ({ path: newPathKey })
52
130
}
131
+ },
132
+ render () {
133
+ const { onEdit , $data: { pages } } = this
134
+ const panes = pages .map (page => {
135
+ return (< a- tab- pane style= {{ height: 0 }} tab= {this .renderTabPane (page .meta .title , page .fullPath )} key= {page .fullPath } closable= {pages .length > 1 }>< / a- tab- pane> )
136
+ })
137
+
138
+ return (
139
+ < div style= " margin: -23px -24px 24px -24px" >
140
+ < a- tabs
141
+ hideAdd
142
+ type= {' editable-card' }
143
+ v- model= {this .activeKey }
144
+ tabBarStyle= {{ background: ' #FFF' , margin: 0 , paddingLeft: ' 16px' , paddingTop: ' 1px' }}
145
+ {... { on: { edit: onEdit } }}>
146
+ {panes}
147
+ < / a- tabs>
148
+ < / div>
149
+ )
53
150
}
54
151
}
55
- </script >
152
+ </script >
0 commit comments