Skip to content

Instantly share code, notes, and snippets.

@ManUtopiK
Created December 1, 2023 12:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ManUtopiK/4020a62b6580660684df3626d0a67a4a to your computer and use it in GitHub Desktop.
Save ManUtopiK/4020a62b6580660684df3626d0a67a4a to your computer and use it in GitHub Desktop.
useBreadcrumbs for Vue
const isMathPatternPath = (pathA: string, pathB: string) => {
const partsA = pathA.split('/');
const partsB = pathB.split('/');
if (partsA.length !== partsB.length) return false;
const isMatch = partsA.every((part: string, i: number) => {
return part === partsB[i] || part.startsWith(':');
})
return isMatch;
}
export const useBreadcrumbs = () => {
const router = useRouter();
const route = useRoute()
const routes = router.getRoutes();
const HOMEPAGE = { name: 'Home', path: '/' };
const breadcrumbs:Ref<Array<{ name: string; path: string; }>> = ref([ HOMEPAGE ])
function getBreadcrumbs(currRoute: string): any[] {
if (currRoute === '') return [ HOMEPAGE ];
const paths = getBreadcrumbs(currRoute.slice(0, currRoute.lastIndexOf('/')));
const founds = routes.filter(r => isMathPatternPath(r.path, currRoute));
const matchRoute = founds.length > 1 ? founds.find(r => r.path === currRoute) : founds[0];
return [
...paths,
{
path: currRoute,
name: matchRoute?.meta?.breadcrumb || matchRoute?.name || matchRoute?.path || currRoute,
}
]
}
watch(() => ({
path: route.path,
name: route.name,
meta: route.meta,
matched: route.matched,
}), (route) => {
if (route.path === '/') return;
breadcrumbs.value = getBreadcrumbs(route.path);
}, {
immediate: true,
})
return {
breadcrumbs
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment