Commit 5ddccf6ba28453b9a35355d53d0db65f1a8876bc

Authored by Netfan
Committed by GitHub
1 parent 644dbe31

feat(tabs): add setTabTitle method (#680)

添加设置标签页标题的方法和演示
src/hooks/web/useTabs.ts
... ... @@ -37,6 +37,15 @@ export function useTabs(_router?: Router) {
37 37 return tabStore.getTabList.find((item) => item.path === route.path)!;
38 38 }
39 39  
  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 +
40 49 async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) {
41 50 const canIUse = canIUseTabs;
42 51 if (!canIUse) {
... ... @@ -81,5 +90,6 @@ export function useTabs(_router?: Router) {
81 90 close: (tab?: RouteLocationNormalized) => {
82 91 handleTabAction(TableActionEnum.CLOSE, tab);
83 92 },
  93 + setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab),
84 94 };
85 95 }
... ...
src/store/modules/multipleTab.ts
... ... @@ -286,6 +286,17 @@ export const useMultipleTabStore = defineStore({
286 286 async bulkCloseTabs(pathList: string[]) {
287 287 this.tabList = this.tabList.filter((item) => !pathList.includes(item.fullPath));
288 288 },
  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 + },
289 300 },
290 301 });
291 302  
... ...
src/views/demo/feat/tabs/index.vue
1 1 <template>
2 2 <PageWrapper title="标签页操作示例">
3 3 <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>
5 9 </CollapseContainer>
6 10  
7 11 <CollapseContainer class="mt-4" title="标签页操作">
... ... @@ -15,18 +19,28 @@
15 19 </PageWrapper>
16 20 </template>
17 21 <script lang="ts">
18   - import { defineComponent } from 'vue';
  22 + import { defineComponent, ref } from 'vue';
19 23 import { CollapseContainer } from '/@/components/Container/index';
20 24 import { useTabs } from '/@/hooks/web/useTabs';
21 25 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';
23 28  
24 29 export default defineComponent({
25 30 name: 'TabsDemo',
26   - components: { CollapseContainer, PageWrapper, [Input.name]: Input },
  31 + components: { CollapseContainer, PageWrapper, [Input.name]: Input, [Alert.name]: Alert },
27 32 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 + }
30 44 return {
31 45 closeAll,
32 46 closeLeft,
... ... @@ -34,6 +48,8 @@
34 48 closeOther,
35 49 closeCurrent,
36 50 refreshPage,
  51 + setTabTitle,
  52 + title,
37 53 };
38 54 },
39 55 });
... ...