mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2025-04-06 03:59:53 +08:00
feat: layout的multiTabs模式时支持刷新当前页面
This commit is contained in:
parent
6eb4bdd050
commit
4bcca52682
@ -25,11 +25,22 @@
|
|||||||
<a-layout-content class="layout-content">
|
<a-layout-content class="layout-content">
|
||||||
<template v-if="multiTabs">
|
<template v-if="multiTabs">
|
||||||
<a-tabs :activeKey="route.path" @tabClick="switchTab" class="layout-content-tabs" hide-add type="editable-card">
|
<a-tabs :activeKey="route.path" @tabClick="switchTab" class="layout-content-tabs" hide-add type="editable-card">
|
||||||
<a-tab-pane v-for="page in openedPageList" :key="page.path" :tab="page.meta.title" closable>
|
<a-tab-pane v-for="page in openedPageList" :key="page.path" closable>
|
||||||
|
<template #tab>
|
||||||
|
{{page.name}}
|
||||||
|
<ReloadOutlined v-show="route.path === page.path" @click="reloadTab(page.path)" class="layout-tabs-close-icon" />
|
||||||
|
</template>
|
||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
|
<router-view v-slot="{ Component, route }">
|
||||||
|
<keep-alive>
|
||||||
|
<component :key="getPageKey(route)" :is="Component" />
|
||||||
|
</keep-alive>
|
||||||
|
</router-view>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<router-view></router-view>
|
||||||
</template>
|
</template>
|
||||||
<slot></slot>
|
|
||||||
</a-layout-content>
|
</a-layout-content>
|
||||||
<a-layout-footer v-if="routeHasLayout" class="layout-footer">
|
<a-layout-footer v-if="routeHasLayout" class="layout-footer">
|
||||||
Ant Design ©2020 Created by MumbleFe
|
Ant Design ©2020 Created by MumbleFe
|
||||||
@ -47,8 +58,12 @@ import Layout from 'ant-design-vue/lib/layout';
|
|||||||
import 'ant-design-vue/lib/layout/style';
|
import 'ant-design-vue/lib/layout/style';
|
||||||
import Tabs from 'ant-design-vue/lib/tabs';
|
import Tabs from 'ant-design-vue/lib/tabs';
|
||||||
import 'ant-design-vue/lib/tabs/style';
|
import 'ant-design-vue/lib/tabs/style';
|
||||||
|
import { ReloadOutlined } from '@ant-design/icons-vue';
|
||||||
import Menu from './Menu';
|
import Menu from './Menu';
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
const getKey = () => ++i;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
[Layout.name]: Layout,
|
[Layout.name]: Layout,
|
||||||
@ -58,6 +73,7 @@ export default {
|
|||||||
[Layout.Footer.name]: Layout.Footer,
|
[Layout.Footer.name]: Layout.Footer,
|
||||||
[Tabs.name]: Tabs,
|
[Tabs.name]: Tabs,
|
||||||
[Tabs.TabPane.name]: Tabs.TabPane,
|
[Tabs.TabPane.name]: Tabs.TabPane,
|
||||||
|
ReloadOutlined,
|
||||||
Menu
|
Menu
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@ -114,15 +130,42 @@ export default {
|
|||||||
});
|
});
|
||||||
router.beforeEach((to) => {
|
router.beforeEach((to) => {
|
||||||
if (!openedPageList.some(page => unref(page.path) === to.path)) {
|
if (!openedPageList.some(page => unref(page.path) === to.path)) {
|
||||||
openedPageList.push(to);
|
openedPageList.push({
|
||||||
|
path: to.path,
|
||||||
|
route: to,
|
||||||
|
name: to.meta.name,
|
||||||
|
key: getKey()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
// 还需要考虑参数
|
// 还需要考虑参数
|
||||||
const switchTab = (path) => {
|
const switchTab = (path) => {
|
||||||
router.push(path);
|
const selectedRoute = openedPageList.find(item => item.path === path);
|
||||||
|
if (selectedRoute) {
|
||||||
|
router.push({
|
||||||
|
path,
|
||||||
|
query: selectedRoute.route.query,
|
||||||
|
params: selectedRoute.route.params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const reloadTab = (path) => {
|
||||||
|
const selectedPage = openedPageList.find(item => item.path === path);
|
||||||
|
if (selectedPage) {
|
||||||
|
selectedPage.key = getKey();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const getPageKey = (_route) => {
|
||||||
|
const selectedPage = openedPageList.find(item => item.path === _route.path);
|
||||||
|
if (selectedPage) {
|
||||||
|
return selectedPage.key;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
|
getPageKey,
|
||||||
|
reloadTab,
|
||||||
switchTab,
|
switchTab,
|
||||||
route,
|
route,
|
||||||
openedPageList,
|
openedPageList,
|
||||||
@ -188,6 +231,16 @@ export default {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
.ant-tabs-nav-container {
|
.ant-tabs-nav-container {
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
|
.layout-tabs-close-icon {
|
||||||
|
vertical-align: middle;
|
||||||
|
color: rgba(0, 0, 0, 0.45);
|
||||||
|
font-size: 12px;
|
||||||
|
margin-left: 6px;
|
||||||
|
margin-top: -2px;
|
||||||
|
&:hover{
|
||||||
|
color: rgba(0, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user