index.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <template>
  2. <el-breadcrumb separator="/" class="flex">
  3. <transition-group name="breadcrumb">
  4. <!--<el-breadcrumb-item :to="{ path: '/' }" class="text-blue=">Dashboard</el-breadcrumb-item>-->
  5. <el-breadcrumb-item v-for="(item, index) in breadcrumbs" :key="index" class="text">{{ item }}</el-breadcrumb-item>
  6. </transition-group>
  7. </el-breadcrumb>
  8. </template>
  9. <script lang="ts" setup>
  10. import router from '/admin/router'
  11. import { watch, onMounted, ref } from 'vue'
  12. import { useAppStore } from '/admin/stores/modules/app'
  13. import { RouteLocationNormalizedLoaded } from 'vue-router'
  14. const appStore = useAppStore()
  15. const breadcrumbs = ref<string[]>([])
  16. // 监听当前路由的变化
  17. watch(router.currentRoute, (newValue, oldValue) => {
  18. // 激活菜单
  19. if (newValue.meta.active_menu) {
  20. appStore.setActiveMenu(newValue.meta.active_menu)
  21. }
  22. setActiveMenu(newValue)
  23. getBreadcrumbs(newValue)
  24. })
  25. // get init breadcrumb
  26. onMounted(() => {
  27. setActiveMenu(router.currentRoute.value)
  28. getBreadcrumbs(router.currentRoute.value)
  29. })
  30. const setActiveMenu = route => {
  31. if (route.path !== '/') {
  32. // 如果是内页,并且设置激活菜单
  33. if (route.meta.active_menu) {
  34. appStore.setActiveMenu(route.meta.active_menu)
  35. } else {
  36. appStore.setActiveMenu(route.path)
  37. }
  38. }
  39. }
  40. // get breadcrums
  41. function getBreadcrumbs(newRoute: RouteLocationNormalizedLoaded) {
  42. breadcrumbs.value = []
  43. breadcrumbs.value.push('首页')
  44. newRoute.matched.forEach(m => {
  45. if (m.meta.title !== undefined) {
  46. breadcrumbs.value.push(m.meta?.title as string)
  47. }
  48. })
  49. }
  50. </script>
  51. <style>
  52. .breadcrumb-leave-active {
  53. transition: all 1s linear;
  54. }
  55. .breadcrumb-leave-to {
  56. opacity: 0;
  57. transition: all 0.3s linear;
  58. }
  59. </style>