Breadcrumb.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <template>
  2. <el-breadcrumb class="app-breadcrumb hidden-sm-and-down" separator="/">
  3. <transition-group appear name="breadcrumb">
  4. <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
  5. <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
  6. <a v-else @click.prevent="handleLink(item)">
  7. {{ item.meta.title }}
  8. </a>
  9. </el-breadcrumb-item>
  10. </transition-group>
  11. </el-breadcrumb>
  12. </template>
  13. <script>
  14. import { defineComponent, ref, watch } from "vue";
  15. import { useRoute, useRouter } from "vue-router";
  16. export default defineComponent({
  17. name: "BreadCrumb",
  18. setup() {
  19. const levelList = ref([]);
  20. const route = useRoute();
  21. const router = useRouter();
  22. const getBreadcrumb = () => {
  23. let matched = route.matched.filter(item => item.meta && item.meta.title);
  24. const first = matched[0];
  25. levelList.value = matched.filter(
  26. item => item.meta && item.meta.title && item.meta.breadcrumb !== false
  27. );
  28. };
  29. getBreadcrumb();
  30. watch(
  31. () => route.path,
  32. () => getBreadcrumb()
  33. );
  34. const handleLink = (item) => {
  35. const { redirect, path } = item;
  36. if (redirect) {
  37. router.push(redirect.toString());
  38. return;
  39. }
  40. router.push(path);
  41. };
  42. return { levelList, handleLink };
  43. }
  44. });
  45. </script>
  46. <style lang="scss" scoped >
  47. .app-breadcrumb.el-breadcrumb {
  48. display: inline-block;
  49. font-size: 14px;
  50. line-height: 50px;
  51. .no-redirect {
  52. color: var(--system-header-breadcrumb-text-color);
  53. cursor: text;
  54. }
  55. a {
  56. color: var(--system-header-text-color);
  57. }
  58. }
  59. </style>