From a1f2b88ad9e69e29253fc4c54d16d6ea806ace86 Mon Sep 17 00:00:00 2001 From: dingwenbin Date: Wed, 2 Sep 2026 17:32:12 +0800 Subject: [PATCH] fix(@vben/layouts): preserve distinct unnamed breadcrumb routes --- .../__tests__/breadcrumb-routes.test.ts | 26 ++++++++++++++++++- .../layouts/src/widgets/breadcrumb-routes.ts | 4 +-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/effects/layouts/src/widgets/__tests__/breadcrumb-routes.test.ts b/packages/effects/layouts/src/widgets/__tests__/breadcrumb-routes.test.ts index 102ecfd36..eb3b14ff1 100644 --- a/packages/effects/layouts/src/widgets/__tests__/breadcrumb-routes.test.ts +++ b/packages/effects/layouts/src/widgets/__tests__/breadcrumb-routes.test.ts @@ -4,7 +4,10 @@ import { describe, expect, it, vi } from 'vitest'; import { resolveBreadcrumbMatches } from '../breadcrumb-routes'; -function createMatch(name: string, path: string): RouteLocationMatched { +function createMatch( + name: RouteLocationMatched['name'], + path: string, +): RouteLocationMatched { return { name, path } as RouteLocationMatched; } @@ -66,4 +69,25 @@ describe('resolveBreadcrumbMatches', () => { ), ).toEqual([root, list, detail]); }); + + it('keeps distinct unnamed matches with the same normalized path', () => { + const parent = createMatch(undefined, '/list'); + const defaultChild = createMatch(undefined, '/list'); + + const result = resolveBreadcrumbMatches( + { + matched: [parent, defaultChild], + meta: { + activePath: '/list', + breadcrumbUseActivePath: true, + title: 'List', + }, + }, + () => ({ matched: [parent] }), + ); + + expect(result).toHaveLength(2); + expect(result[0]).toBe(parent); + expect(result[1]).toBe(defaultChild); + }); }); diff --git a/packages/effects/layouts/src/widgets/breadcrumb-routes.ts b/packages/effects/layouts/src/widgets/breadcrumb-routes.ts index 5c65b22ff..498a11fe4 100644 --- a/packages/effects/layouts/src/widgets/breadcrumb-routes.ts +++ b/packages/effects/layouts/src/widgets/breadcrumb-routes.ts @@ -27,9 +27,9 @@ export function resolveBreadcrumbMatches( return route.matched; } - const seen = new Set(activeMatches.map((match) => match.name ?? match.path)); + const seen = new Set(activeMatches.map((match) => match.name ?? match)); const currentMatches = route.matched.filter((match) => { - const key = match.name ?? match.path; + const key = match.name ?? match; if (seen.has(key)) { return false; }