Breadcrumb.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <script setup lang="ts">
  2. import type { Bread } from '@/components/Breadcrumb/types'
  3. import { useBreadcrumbs } from '@/composables/useBreadcrumbs'
  4. const route = useRoute()
  5. const router = useRouter()
  6. const computedBreadList = computed(() => {
  7. const result: Bread[] = []
  8. route.matched.forEach(item => {
  9. if (item.meta?.lastRouteName) {
  10. const lastRoute = router.resolve({ name: item.meta.lastRouteName })
  11. result.push({
  12. name: lastRoute.name as string,
  13. translatedName: lastRoute.meta.name as never as () => string,
  14. path: lastRoute.path,
  15. })
  16. }
  17. result.push({
  18. name: item.name as string,
  19. translatedName: item.meta.name as never as () => string,
  20. path: item.path,
  21. hasChildren: item.children?.length > 0,
  22. })
  23. })
  24. return result
  25. })
  26. const breadList = useBreadcrumbs()
  27. onMounted(() => {
  28. breadList.value = computedBreadList.value
  29. })
  30. watch(route, () => {
  31. breadList.value = computedBreadList.value
  32. })
  33. </script>
  34. <template>
  35. <ABreadcrumb class="breadcrumb">
  36. <ABreadcrumbItem
  37. v-for="(item, index) in breadList"
  38. :key="item.name"
  39. >
  40. <RouterLink
  41. v-if="index === 0 || !item.hasChildren && index !== breadList.length - 1"
  42. :to="{ path: item.path === '' ? '/' : item.path, query: item.query }"
  43. >
  44. {{ item.translatedName() }}
  45. </RouterLink>
  46. <span v-else-if="item.hasChildren">{{ item.translatedName() }}</span>
  47. <span v-else>{{ item.translatedName() }}</span>
  48. </ABreadcrumbItem>
  49. </ABreadcrumb>
  50. </template>
  51. <style scoped>
  52. </style>