Skip to content

Commit 311a0ae

Browse files
author
Lison
authored
Merge pull request #993 from iview/2.0
增加JS控制关闭页面方法,增加关闭页面前的钩子
2 parents c31d61c + 09735a7 commit 311a0ae

36 files changed

+98
-23
lines changed

src/view/main/components/tags-nav/tags-nav.vue renamed to src/components/main/components/tags-nav/tags-nav.vue

+14-2
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)
File renamed without changes.
File renamed without changes.

src/view/main/main.vue renamed to src/components/main/main.vue

+6-6
Original file line numberDiff line numberDiff line change
@@ -114,34 +114,34 @@ 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)
135130
}
136131
},
137132
watch: {
138133
'$route' (newRoute) {
134+
const { name, query, params, meta } = newRoute
135+
this.addTag({
136+
route: { name, query, params, meta },
137+
type: 'push'
138+
})
139139
this.setBreadCrumb(newRoute.matched)
140140
this.setTagNavList(getNewTagList(this.tagNavList, newRoute))
141+
this.$refs.sideMenu.updateOpenName(newRoute.name)
141142
}
142143
},
143144
mounted () {
144-
console.log(123123123131231)
145145
/**
146146
* @description 初始化设置面包屑导航和标签导航
147147
*/

src/libs/util.js

+1
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/main.js

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import importDirective from '@/directive'
1111
import 'iview/dist/styles/iview.css'
1212
import './index.less'
1313
import '@/assets/icons/iconfont.css'
14-
// import '@/mock'
1514
// 实际打包时应该不引入mock
1615
/* eslint-disable */
1716
if (process.env.NODE_ENV !== 'production') require('@/mock')

src/router/before-close.js

+17
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

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Main from '@/view/main'
1+
import Main from '@/components/main'
22
import parentView from '@/components/parent-view'
33

44
/**
@@ -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

+35-1
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

+17-10
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)
@@ -42,11 +53,6 @@ export default {
4253
title: `动态路由-${id}`
4354
}
4455
}
45-
this.addTag({
46-
route: route,
47-
type: 'push'
48-
})
49-
console.log(route)
5056
this.$router.push(route)
5157
},
5258
createTagQuery () {
@@ -60,11 +66,12 @@ export default {
6066
title: `参数-${id}`
6167
}
6268
}
63-
this.addTag({
64-
route: route,
65-
type: 'push'
66-
})
6769
this.$router.push(route)
70+
},
71+
handleCloseTag () {
72+
this.closeTag({
73+
name: 'tools_methods_page'
74+
})
6875
}
6976
}
7077
}

vue.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ module.exports = {
2626
baseUrl: BASE_URL,
2727
// tweak internal webpack configuration.
2828
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
29+
// 如果你不需要使用eslint,把lintOnSave设为false即可
30+
lintOnSave: true,
2931
chainWebpack: config => {
3032
config.resolve.alias
3133
.set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components'))

0 commit comments

Comments
 (0)