feat: layout的multiTabs模式时支持刷新当前页面

This commit is contained in:
万纯 2021-01-05 20:56:03 +08:00
parent 6eb4bdd050
commit 4bcca52682

View File

@ -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);
}
}
} }
} }
} }