1. 程式人生 > 其它 >vue3 router + element+動態麵包屑方案

vue3 router + element+動態麵包屑方案

vue3麵包屑根據url進行動態改變,其實就是監聽router變化,然後動態繪製即可

<template>
  <el-breadcrumb class="breadcrumb" separator="/">
    <transition-group name="breadcrumb">
      <el-breadcrumb-item
        v-for="(item, index) in breadcrumbData"
        :key="item.path"
      >
        <!-- 不可點選項 -->
        <span v-if
="index === breadcrumbData.length - 1" class="no-redirect">{{ generateTitle(item.meta.title) }}</span> <!-- 可點選項 --> <a v-else class="redirect" @click.prevent="onLinkClick(item)">{{ generateTitle(item.meta.title) }}</a> </el-breadcrumb-item> </transition-group> </el-breadcrumb> </template> <script setup> import { generateTitle } from
'@/utils/i18n' import { ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { useStore } from 'vuex' const route = useRoute() // 生成陣列資料 const breadcrumbData = ref([]) const getBreadcrumbData = () => { breadcrumbData.value = route.matched.filter( item => item.meta && item.meta.title ) }
// 監聽路由變化時觸發 watch( route, () => { getBreadcrumbData() }, { immediate: true } ) // 處理點選事件 const router = useRouter() const onLinkClick = item => { console.log(item) router.push(item.path) } // 將來需要進行主題替換,所以這裡獲取下動態樣式 const store = useStore() // eslint-disable-next-line const linkHoverColor = ref(store.getters.cssVar.menuBg) </script> <style lang="scss" scoped> .breadcrumb { display: inline-block; font-size: 14px; line-height: 50px; margin-left: 8px; .no-redirect { color: #97a8be; cursor: text; } .redirect { color: #666; font-weight: 600; } } </style>