hi-ucs/back/src/views/main-content.vue

164 lines
4.6 KiB
Vue
Raw Normal View History

2022-06-14 09:32:49 +08:00
<template>
<main :class="['aui-content', { 'aui-content--tabs': $route.meta.isTab }]">
<!-- tab展示内容 -->
<template v-if="$route.meta.isTab">
<el-dropdown class="aui-content--tabs-tools">
<i class="el-icon-arrow-down"></i>
<el-dropdown-menu slot="dropdown" :show-timeout="0">
2022-06-21 15:48:41 +08:00
<el-dropdown-item
@click.native="tabRemoveHandle($store.state.contentTabsActiveName)"
>{{ $t("contentTabs.closeCurrent") }}</el-dropdown-item
>
<el-dropdown-item @click.native="tabsCloseOtherHandle()">{{
$t("contentTabs.closeOther")
}}</el-dropdown-item>
<el-dropdown-item @click.native="tabsCloseAllHandle()">{{
$t("contentTabs.closeAll")
}}</el-dropdown-item>
2022-06-14 09:32:49 +08:00
</el-dropdown-menu>
</el-dropdown>
2022-06-21 15:48:41 +08:00
<el-tabs
v-model="$store.state.contentTabsActiveName"
@tab-click="tabSelectedHandle"
@tab-remove="tabRemoveHandle"
>
2022-06-14 09:32:49 +08:00
<el-tab-pane
v-for="item in $store.state.contentTabs"
:key="item.name"
:name="item.name"
:label="item.title"
:closable="item.name !== 'home'"
2022-06-21 15:48:41 +08:00
:class="{ 'is-iframe': tabIsIframe(item.iframeURL) }"
>
2022-06-14 09:32:49 +08:00
<template v-if="item.name === 'home'">
2022-06-21 15:48:41 +08:00
<svg
slot="label"
class="icon-svg aui-content--tabs-icon-nav"
aria-hidden="true"
>
<use xlink:href="#icon-home"></use>
</svg>
2022-06-14 09:32:49 +08:00
</template>
2022-06-21 15:48:41 +08:00
<iframe
v-if="tabIsIframe(item.iframeURL)"
:src="item.iframeURL"
width="100%"
height="100%"
frameborder="0"
scrolling="yes"
></iframe>
2022-06-14 09:32:49 +08:00
<keep-alive v-else>
2022-06-21 15:48:41 +08:00
<router-view
v-if="item.name === $store.state.contentTabsActiveName"
/>
2022-06-14 09:32:49 +08:00
</keep-alive>
</el-tab-pane>
</el-tabs>
</template>
<!-- 其他方式, 展示内容 -->
<template v-else>
<keep-alive>
<router-view />
</keep-alive>
</template>
</main>
</template>
<script>
2022-11-24 19:54:20 +08:00
import { isURL } from '@/utils/validate'
2022-06-14 09:32:49 +08:00
export default {
2022-11-24 19:54:20 +08:00
data () {
return {}
2022-06-14 09:32:49 +08:00
},
methods: {
// tabs, 是否通过iframe展示
2022-11-24 19:54:20 +08:00
tabIsIframe (url) {
return isURL(url)
2022-06-14 09:32:49 +08:00
},
// tabs, 选中tab
2022-11-24 19:54:20 +08:00
tabSelectedHandle (tab) {
2022-06-21 15:48:41 +08:00
tab = this.$store.state.contentTabs.filter(
(item) => item.name === tab.name
2022-11-24 19:54:20 +08:00
)[0]
2022-06-14 09:32:49 +08:00
if (tab) {
this.$router.push({
2022-11-24 19:54:20 +08:00
name: /^iframe_.+/.test(tab.name) ? 'iframe' : tab.name,
2022-06-21 15:48:41 +08:00
params: { ...tab.params },
2022-11-24 19:54:20 +08:00
query: { ...tab.query }
})
2022-06-14 09:32:49 +08:00
}
},
// tabs, 删除tab
2022-11-24 19:54:20 +08:00
tabRemoveHandle (tabName) {
if (tabName === 'home') {
return false
2022-06-14 09:32:49 +08:00
}
2022-11-24 19:54:20 +08:00
console.log('删除', this.$store.state.contentTabs)
if (this.$store.state.contentTabs.length !== 1) {
this.$store.state.contentTabs = this.$store.state.contentTabs.filter(
(item) => item.name !== tabName
)
} else {
this.$message({
message: '必须打开一个窗口!',
type: 'warning'
})
2022-06-14 09:32:49 +08:00
}
2022-11-24 19:54:20 +08:00
// if (this.$store.state.contentTabs.length <= 0) {
// this.$store.state.sidebarMenuActiveName =
// this.$store.state.contentTabsActiveName = 'home'
// return false
// }
2022-06-14 09:32:49 +08:00
// 当前选中tab被删除
if (tabName === this.$store.state.contentTabsActiveName) {
2022-11-24 19:54:20 +08:00
const tab =
2022-06-21 15:48:41 +08:00
this.$store.state.contentTabs[
this.$store.state.contentTabs.length - 1
2022-11-24 19:54:20 +08:00
]
2022-06-14 09:32:49 +08:00
this.$router.push({
2022-11-24 19:54:20 +08:00
name: /^iframe_.+/.test(tab.name) ? 'iframe' : tab.name,
2022-06-14 09:32:49 +08:00
params: { ...tab.params },
2022-11-24 19:54:20 +08:00
query: { ...tab.query }
})
2022-06-14 09:32:49 +08:00
}
},
// tabs, 关闭其它
2022-11-24 19:54:20 +08:00
tabsCloseOtherHandle () {
2022-06-21 15:48:41 +08:00
this.$store.state.contentTabs = this.$store.state.contentTabs.filter(
(item) => {
return (
2022-11-24 19:54:20 +08:00
item.name === 'home' ||
2022-06-21 15:48:41 +08:00
item.name === this.$store.state.contentTabsActiveName
2022-11-24 19:54:20 +08:00
)
2022-06-21 15:48:41 +08:00
}
2022-11-24 19:54:20 +08:00
)
2022-06-14 09:32:49 +08:00
},
// tabs, 关闭全部
2022-11-24 19:54:20 +08:00
tabsCloseAllHandle () {
2022-06-21 15:48:41 +08:00
this.$store.state.contentTabs = this.$store.state.contentTabs.filter(
2022-11-24 19:54:20 +08:00
(item) => item.name === 'home'
)
this.$router.push({ name: 'home' })
}
}
}
2022-06-21 15:48:41 +08:00
</script>
<style scoped lang="scss">
.aui-content {
.el-tabs {
::v-deep .el-tabs__header {
left: 266px;
.el-tabs__nav-wrap {
.el-tabs__nav-scroll {
.el-tabs__nav {
.el-tabs__item ::after {
background-color: #0058e1;
}
}
}
}
2022-06-14 09:32:49 +08:00
}
}
}
2022-11-24 19:54:20 +08:00
</style>