Skip to content

Commit 5ddccf6

Browse files
authored
feat(tabs): add setTabTitle method (#680)
添加设置标签页标题的方法和演示
1 parent 644dbe3 commit 5ddccf6

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

src/hooks/web/useTabs.ts

+10
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ export function useTabs(_router?: Router) {
3737
return tabStore.getTabList.find((item) => item.path === route.path)!;
3838
}
3939

40+
async function updateTabTitle(title: string, tab?: RouteLocationNormalized) {
41+
const canIUse = canIUseTabs;
42+
if (!canIUse) {
43+
return;
44+
}
45+
const targetTab = tab || getCurrentTab();
46+
await tabStore.setTabTitle(title, targetTab);
47+
}
48+
4049
async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) {
4150
const canIUse = canIUseTabs;
4251
if (!canIUse) {
@@ -81,5 +90,6 @@ export function useTabs(_router?: Router) {
8190
close: (tab?: RouteLocationNormalized) => {
8291
handleTabAction(TableActionEnum.CLOSE, tab);
8392
},
93+
setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab),
8494
};
8595
}

src/store/modules/multipleTab.ts

+11
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,17 @@ export const useMultipleTabStore = defineStore({
286286
async bulkCloseTabs(pathList: string[]) {
287287
this.tabList = this.tabList.filter((item) => !pathList.includes(item.fullPath));
288288
},
289+
290+
/**
291+
* Set tab's title
292+
*/
293+
async setTabTitle(title: string, route: RouteLocationNormalized) {
294+
const findTab = this.getTabList.find((item) => item === route);
295+
if (findTab) {
296+
findTab.meta.title = title;
297+
await this.updateCacheTab();
298+
}
299+
},
289300
},
290301
});
291302

src/views/demo/feat/tabs/index.vue

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<template>
22
<PageWrapper title="标签页操作示例">
33
<CollapseContainer title="在下面输入框输入文本,切换后回来内容会保存">
4-
<a-input placeholder="请输入" />
4+
<a-alert banner message="该操作不会影响页面标题,仅修改Tab标题" />
5+
<template class="mt-2 flex flex-grow-0">
6+
<a-button class="mr-2" @click="setTabTitle" type="primary"> 设置Tab标题 </a-button>
7+
<a-input placeholder="请输入" v-model:value="title" class="mr-4 w-12" />
8+
</template>
59
</CollapseContainer>
610

711
<CollapseContainer class="mt-4" title="标签页操作">
@@ -15,25 +19,37 @@
1519
</PageWrapper>
1620
</template>
1721
<script lang="ts">
18-
import { defineComponent } from 'vue';
22+
import { defineComponent, ref } from 'vue';
1923
import { CollapseContainer } from '/@/components/Container/index';
2024
import { useTabs } from '/@/hooks/web/useTabs';
2125
import { PageWrapper } from '/@/components/Page';
22-
import { Input } from 'ant-design-vue';
26+
import { Input, Alert } from 'ant-design-vue';
27+
import { useMessage } from '/@/hooks/web/useMessage';
2328
2429
export default defineComponent({
2530
name: 'TabsDemo',
26-
components: { CollapseContainer, PageWrapper, [Input.name]: Input },
31+
components: { CollapseContainer, PageWrapper, [Input.name]: Input, [Alert.name]: Alert },
2732
setup() {
28-
const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage } = useTabs();
29-
33+
const title = ref<string>('');
34+
const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage, setTitle } =
35+
useTabs();
36+
const { createMessage } = useMessage();
37+
function setTabTitle() {
38+
if (title.value) {
39+
setTitle(title.value);
40+
} else {
41+
createMessage.error('请输入要设置的Tab标题!');
42+
}
43+
}
3044
return {
3145
closeAll,
3246
closeLeft,
3347
closeRight,
3448
closeOther,
3549
closeCurrent,
3650
refreshPage,
51+
setTabTitle,
52+
title,
3753
};
3854
},
3955
});

0 commit comments

Comments
 (0)