205 lines
5.3 KiB
Vue
205 lines
5.3 KiB
Vue
<template>
|
|
<div class="router-history">
|
|
<el-tabs
|
|
:closable="!(historys.length==1&&this.$route.name=='dashboard')"
|
|
@contextmenu.prevent.native="openContextMenu($event)"
|
|
@tab-click="changeTab"
|
|
@tab-remove="removeTab"
|
|
type="card"
|
|
v-model="activeValue"
|
|
>
|
|
<el-tab-pane
|
|
:key="item.name"
|
|
:label="item.meta.title"
|
|
:name="item.name"
|
|
v-for="item in historys"
|
|
></el-tab-pane>
|
|
</el-tabs>
|
|
|
|
<!--自定义右键菜单html代码-->
|
|
<ul :style="{left:left+'px',top:top+'px'}" class="contextmenu" v-show="contextMenuVisible">
|
|
<li @click="closeAll">关闭所有</li>
|
|
<li @click="closeLeft">关闭左边</li>
|
|
<li @click="closeRight">关闭右边</li>
|
|
<li @click="closeOther">关闭其他</li>
|
|
</ul>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
export default {
|
|
name: 'HistoryComponent',
|
|
data() {
|
|
return {
|
|
historys: [],
|
|
activeValue: 'dashboard',
|
|
contextMenuVisible: false,
|
|
left: 0,
|
|
top: 0,
|
|
isCollapse: false,
|
|
isMobile:false,
|
|
rightActive: ''
|
|
}
|
|
},
|
|
created() {
|
|
this.$bus.on('mobile',(isMobile)=>{
|
|
this.isMobile = isMobile
|
|
})
|
|
this.$bus.on('collapse',(isCollapse)=>{
|
|
this.isCollapse = isCollapse
|
|
})
|
|
const initHistorys = [
|
|
{
|
|
name: 'dashboard',
|
|
meta: {
|
|
title: '仪表盘'
|
|
}
|
|
}
|
|
]
|
|
this.historys =
|
|
JSON.parse(sessionStorage.getItem('historys')) || initHistorys
|
|
this.setTab(this.$route)
|
|
},
|
|
|
|
beforeDestroy(){
|
|
this.$bus.off('collapse')
|
|
this.$bus.off('mobile')
|
|
},
|
|
methods: {
|
|
openContextMenu(e) {
|
|
if (this.historys.length == 1 && this.$route.name == 'dashboard') {
|
|
return false
|
|
}
|
|
if (e.srcElement.id) {
|
|
this.contextMenuVisible = true
|
|
let width
|
|
if (this.isCollapse) {
|
|
width = 54
|
|
} else {
|
|
width = 220
|
|
}
|
|
if(this.isMobile){
|
|
width = 0
|
|
}
|
|
this.left = e.clientX - width
|
|
this.top = e.clientY + 10
|
|
this.rightActive = e.srcElement.id.split('-')[1]
|
|
}
|
|
},
|
|
closeAll() {
|
|
this.historys = [
|
|
{
|
|
name: 'dashboard',
|
|
meta: {
|
|
title: '仪表盘'
|
|
}
|
|
}
|
|
]
|
|
this.$router.push({ name: 'dashboard' })
|
|
this.contextMenuVisible = false
|
|
sessionStorage.setItem('historys', JSON.stringify(this.historys))
|
|
},
|
|
closeLeft() {
|
|
const rightIndex = this.historys.findIndex(
|
|
item => item.name == this.rightActive
|
|
)
|
|
const activeIndex = this.historys.findIndex(
|
|
item => item.name == this.activeValue
|
|
)
|
|
this.historys.splice(0, rightIndex)
|
|
if (rightIndex > activeIndex) {
|
|
this.$router.push({ name: this.rightActive })
|
|
}
|
|
sessionStorage.setItem('historys', JSON.stringify(this.historys))
|
|
},
|
|
closeRight() {
|
|
const leftIndex = this.historys.findIndex(
|
|
item => item.name == this.rightActive
|
|
)
|
|
const activeIndex = this.historys.findIndex(
|
|
item => item.name == this.activeValue
|
|
)
|
|
this.historys.splice(leftIndex, this.historys.length)
|
|
if (leftIndex < activeIndex) {
|
|
this.$router.push({ name: this.rightActive })
|
|
}
|
|
sessionStorage.setItem('historys', JSON.stringify(this.historys))
|
|
},
|
|
closeOther() {
|
|
this.historys = this.historys.filter(
|
|
item => item.name == this.rightActive
|
|
)
|
|
this.$router.push({ name: this.rightActive })
|
|
sessionStorage.setItem('historys', JSON.stringify(this.historys))
|
|
},
|
|
setTab(route) {
|
|
if (!this.historys.some(item => item.name == route.name)) {
|
|
const obj = {}
|
|
obj.name = route.name
|
|
obj.meta = route.meta
|
|
this.historys.push(obj)
|
|
}
|
|
this.activeValue = this.$route.name
|
|
},
|
|
changeTab(tab) {
|
|
this.$router.push({ name: tab.name })
|
|
},
|
|
removeTab(tab) {
|
|
const index = this.historys.findIndex(item => item.name == tab)
|
|
if (this.$route.name == tab) {
|
|
if (this.historys.length == 1) {
|
|
this.$router.push({ name: 'dashboard' })
|
|
} else {
|
|
if (index < this.historys.length - 1) {
|
|
this.$router.push({ name: this.historys[index + 1].name })
|
|
} else {
|
|
this.$router.push({ name: this.historys[index - 1].name })
|
|
}
|
|
}
|
|
}
|
|
this.historys.splice(index, 1)
|
|
}
|
|
},
|
|
watch: {
|
|
contextMenuVisible() {
|
|
if (this.contextMenuVisible) {
|
|
document.body.addEventListener('click', () => {
|
|
this.contextMenuVisible = false
|
|
})
|
|
} else {
|
|
document.body.removeEventListener('click', () => {
|
|
this.contextMenuVisible = false
|
|
})
|
|
}
|
|
},
|
|
$route(to) {
|
|
this.historys = this.historys.filter(item => !item.meta.hidden)
|
|
this.setTab(to)
|
|
sessionStorage.setItem('historys', JSON.stringify(this.historys))
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="scss">
|
|
.contextmenu {
|
|
width: 100px;
|
|
margin: 0;
|
|
border: 1px solid #ccc;
|
|
background: #fff;
|
|
z-index: 3000;
|
|
position: absolute;
|
|
list-style-type: none;
|
|
padding: 5px 0;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
color: #333;
|
|
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.2);
|
|
}
|
|
.contextmenu li {
|
|
margin: 0;
|
|
padding: 7px 16px;
|
|
}
|
|
.contextmenu li:hover {
|
|
background: #f2f2f2;
|
|
cursor: pointer;
|
|
}
|
|
</style> |