Skip to content

Commit 09735a7

Browse files
添加关闭tab标签之前的回调,添加JS关闭页面的方法
1 parent 5418058 commit 09735a7

File tree

7 files changed

+90
-11
lines changed

7 files changed

+90
-11
lines changed

src/components/main/components/tags-nav/tags-nav.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
<script>
3838
import { showTitle, routeEqual } from '@/libs/util'
39+
import beforeClose from '@/router/before-close'
3940
export default {
4041
name: 'TagsNav',
4142
props: {
@@ -108,8 +109,19 @@ export default {
108109
}
109110
},
110111
handleClose (current) {
111-
let res = this.list.filter(item => !routeEqual(current, item))
112-
this.$emit('on-close', res, undefined, current)
112+
if (current.meta && current.meta.beforeCloseName && current.meta.beforeCloseName in beforeClose) {
113+
new Promise(beforeClose[current.meta.beforeCloseName]).then(close => {
114+
if (close) {
115+
this.close(current)
116+
}
117+
})
118+
} else {
119+
this.close(current)
120+
}
121+
},
122+
close (route) {
123+
let res = this.list.filter(item => !routeEqual(route, item))
124+
this.$emit('on-close', res, undefined, route)
113125
},
114126
handleClick (item) {
115127
this.$emit('input', item)

src/components/main/main.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,21 +114,16 @@ export default {
114114
this.collapsed = state
115115
},
116116
handleCloseTag (res, type, route) {
117-
let openName = ''
118117
if (type === 'all') {
119118
this.turnToPage('home')
120-
openName = 'home'
121119
} else if (routeEqual(this.$route, route)) {
122120
if (type === 'others') {
123-
openName = route.name
124121
} else {
125122
const nextRoute = getNextRoute(this.tagNavList, route)
126123
this.$router.push(nextRoute)
127-
openName = nextRoute.name
128124
}
129125
}
130126
this.setTagNavList(res)
131-
this.$refs.sideMenu.updateOpenName(openName)
132127
},
133128
handleClick (item) {
134129
this.turnToPage(item)
@@ -143,6 +138,7 @@ export default {
143138
})
144139
this.setBreadCrumb(newRoute.matched)
145140
this.setTagNavList(getNewTagList(this.tagNavList, newRoute))
141+
this.$refs.sideMenu.updateOpenName(newRoute.name)
146142
}
147143
},
148144
mounted () {

src/libs/util.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ export const getNextRoute = (list, route) => {
172172
res = getHomeRoute(list)
173173
} else {
174174
const index = list.findIndex(item => routeEqual(item, route))
175+
console.log(route, index, list.length)
175176
if (index === list.length - 1) res = list[list.length - 2]
176177
else res = list[index + 1]
177178
}

src/router/before-close.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Modal } from 'iview'
2+
3+
const beforeClose = {
4+
before_close_normal: (resolve) => {
5+
Modal.confirm({
6+
title: '确定要关闭这一页吗',
7+
onOk: () => {
8+
resolve(true)
9+
},
10+
onCancel: () => {
11+
resolve(false)
12+
}
13+
})
14+
}
15+
}
16+
17+
export default beforeClose

src/router/routers.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import parentView from '@/components/parent-view'
88
* notCache: (false) 设为true后页面不会缓存
99
* access: (null) 可访问该页面的权限数组,当前路由设置的权限会影响子路由
1010
* icon: (-) 该页面在左侧菜单、面包屑和标签导航处显示的图标,如果是自定义图标,需要在图标名称前加下划线'_'
11+
* beforeCloseName: (-) 设置该字段,则在关闭当前tab页时会去'@/router/before-close.js'里寻找该字段名对应的方法,作为关闭前的钩子函数
1112
* }
1213
*/
1314

@@ -213,7 +214,8 @@ export default [
213214
name: 'tools_methods_page',
214215
meta: {
215216
icon: 'ios-hammer',
216-
title: '工具方法'
217+
title: '工具方法',
218+
beforeCloseName: 'before_close_normal'
217219
},
218220
component: () => import('@/view/tools-methods/tools-methods.vue')
219221
}
@@ -303,7 +305,8 @@ export default [
303305
meta: {
304306
icon: 'md-flower',
305307
title: '动态路由',
306-
notCache: true
308+
notCache: true,
309+
beforeCloseName: 'before_close_normal'
307310
},
308311
component: () => import('@/view/argu-page/params.vue')
309312
},

src/store/module/app.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
1-
import { getBreadCrumbList, setTagNavListInLocalstorage, getMenuByRouter, getTagNavListFromLocalstorage, getHomeRoute, routeHasExist } from '@/libs/util'
1+
import {
2+
getBreadCrumbList,
3+
setTagNavListInLocalstorage,
4+
getMenuByRouter,
5+
getTagNavListFromLocalstorage,
6+
getHomeRoute,
7+
getNextRoute,
8+
routeHasExist,
9+
routeEqual
10+
} from '@/libs/util'
11+
import beforeClose from '@/router/before-close'
12+
import router from '@/router'
213
import routers from '@/router/routers'
14+
15+
const closePage = (state, route) => {
16+
const nextRoute = getNextRoute(state.tagNavList, route)
17+
state.tagNavList = state.tagNavList.filter(item => {
18+
return !routeEqual(item, route)
19+
})
20+
router.push(nextRoute)
21+
}
22+
323
export default {
424
state: {
525
breadCrumbList: [],
@@ -20,6 +40,20 @@ export default {
2040
setTagNavListInLocalstorage([...list])
2141
} else state.tagNavList = getTagNavListFromLocalstorage()
2242
},
43+
closeTag (state, route) {
44+
let tag = state.tagNavList.filter(item => routeEqual(item, route))
45+
route = tag[0] ? tag[0] : null
46+
if (!route) return
47+
if (route.meta && route.meta.beforeCloseName && route.meta.beforeCloseName in beforeClose) {
48+
new Promise(beforeClose[route.meta.beforeCloseName]).then(close => {
49+
if (close) {
50+
closePage(state, route)
51+
}
52+
})
53+
} else {
54+
closePage(state, route)
55+
}
56+
},
2357
addTag (state, { route, type = 'unshift' }) {
2458
if (!routeHasExist(state.tagNavList, route)) {
2559
if (type === 'push') state.tagNavList.push(route)

src/view/tools-methods/tools-methods.vue

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
</i-col>
2121
</Row>
2222
</Card>
23+
<Card shadow style="margin-top: 10px;">
24+
<Row>
25+
<i-col span="4">
26+
<Button @click="handleCloseTag">关闭工具方法页</Button>
27+
</i-col>
28+
<i-col span="20">
29+
<p>动态路由,添加query</p>
30+
</i-col>
31+
</Row>
32+
</Card>
2333
</div>
2434
</template>
2535

@@ -29,7 +39,8 @@ export default {
2939
name: 'tools_methods_page',
3040
methods: {
3141
...mapMutations([
32-
'addTag'
42+
'addTag',
43+
'closeTag'
3344
]),
3445
createTagParams () {
3546
const id = parseInt(Math.random() * 100000)
@@ -56,6 +67,11 @@ export default {
5667
}
5768
}
5869
this.$router.push(route)
70+
},
71+
handleCloseTag () {
72+
this.closeTag({
73+
name: 'tools_methods_page'
74+
})
5975
}
6076
}
6177
}

0 commit comments

Comments
 (0)