Skip to content

浏览器标题策略 ​

路由在成功导航后更新浏览器标签页标题。它与页面 heading、菜单标签是三个独立位置。

声明路由标题 ​

ts
const route = {
  path: '/books',
  component: () => import('../pages/BooksPage.vue'),
  meta: { title: 'BookStore::Menu:Books' },
};

当 environment.application.name = 'BookStore',英文翻译为 Books 时,默认标题为 Books | BookStore。

条件结果
路由有 meta.title本地化路由标题加应用名称
路由没有标题应用名称
切换语言重新计算当前标题
导航失败保留原来的标题

Vue Router 会合并匹配路由的 metadata,策略读取当前 to.meta.title。子路由需要不同标题时,应显式声明自己的 title。

应用名称来自 environment.application.name,按普通文本使用。应用名称也需要本地化时,可以自定义策略。

移除应用名称后缀 ​

ts
provideAbpCore(withOptions({
  environment,
  disableProjectNameInTitle: true,
}));

有标题的路由会显示 Books,没有标题的路由仍显示应用名称。此选项属于 Core 配置,不是路由属性。

替换策略 ​

创建 src/custom-title.ts:

ts
import {
  ABP_ROOT_OPTIONS,
  defineService,
  DocumentService,
  inject,
  LocalizationService,
  onServiceDestroy,
  provideAppInitializer,
} from '@lsw-abpvue/core';
import { withTitleStrategy, type TitleStrategy } from '@lsw-abpvue/core/router';

export const CustomTitleStrategy = defineService('CustomTitleStrategy', () => {
  const documentService = inject(DocumentService);
  const localization = inject(LocalizationService);
  const options = inject(ABP_ROOT_OPTIONS);
  let title: string | undefined;
  let stop: (() => void) | undefined;

  function update(): void {
    const name = options.environment.application.name;
    documentService.setTitle(title ? `${name} — ${localization.t(title)}` : name);
  }

  onServiceDestroy(() => stop?.());
  return {
    init: () => {
      stop ??= localization.onLanguageChange(update);
    },
    setTitle: (value: string | undefined) => {
      title = value;
      update();
    },
  } satisfies TitleStrategy & { init(): void };
});

export const customTitleFeature = withTitleStrategy(CustomTitleStrategy);
export const initializeCustomTitle = provideAppInitializer(() => {
  inject(CustomTitleStrategy).init();
});

示例输出 BookStore — Books,并在初始化时显式订阅语言变化。通过路由与应用初始化器注册:

ts
import { customTitleFeature, initializeCustomTitle } from './custom-title';

const providers = [
  provideAbpCore(withOptions({ environment })),
  provideAbpRouter(routes, customTitleFeature),
  initializeCustomTitle,
  // OAuth, theme and module providers...
];

environment 和 routes 使用应用已有的启动配置。withTitleStrategy 从 @lsw-abpvue/core/router 导入,传给 provideAbpRouter。替换服务实现 setTitle(title: string | undefined): void,可注入平台与本地化服务。

通过 DocumentService 访问文档,随服务销毁清理订阅。路由标题、AbpPage.title 和菜单标签可以共用 key,但它们分别控制不同的界面位置。

检查效果 ​

依次访问有标题的路由、切换语言、访问无标题路由,并检查被守卫拒绝的导航,观察浏览器标签页。相关内容见路由。

非官方社区项目,采用 MIT 许可证,与 Volosoft 无关。