vue面包屑动态标题 多级路由嵌套设置显示

面包屑效果

三级路由,可以通过面包屑进行跨级跳转
在这里插入图片描述
面包屑组件,breadcrumb.vue

<template>
  <div class="navbar clearfix">
    <el-breadcrumb
      class="breadcrumb-container"
      separator-class="el-icon-arrow-right"
    >
      <el-breadcrumb-item
        v-for="item in levelList"
        :key="item.path"
        :to="item.path"
        >{{ item.meta.title }}</el-breadcrumb-item
      >
    </el-breadcrumb>
  </div>
</template>

<script>
export default {
  name: "Navbar",
  data() {
    return {
      levelList: [],
    };
  },
  watch: {
    $route() {
      this.getBreadcrumb();
    },
  },
  created() {
    this.getBreadcrumb();
  },
  methods: {
    back() {
      this.$router.go(-1); //返回上一层
    },
    getBreadcrumb() {
      //$route.matched一个数组 包含当前路由的所有嵌套路径片段的路由记录
      let matched = this.$route.matched.filter((item) => item.meta.title);
      const first = matched[0];
      this.levelList = matched;
    },
  },
};
</script>

应用

在最外层引入这个组件

<script>
  import Breadcrumb from './navbar.vue'
  export default {
    components: {
      Breadcrumb
    }
}
</script>

路由

多级路由嵌套设置默认页面 只需要把默认的子路由的path项设定为空
以下为路由的索引页./route/index.js的实例

import Vue from 'vue'
import Router from 'vue-router'
 
Vue.use(Router);
 
export default new Router({
  routes: [{
      path: '/',
      name: 'Login',
      component: resolve => require(['@/components/Login'], resolve),
      hidden: true //表示在左侧导航栏隐藏
    },
    {
      path: '/home.html',
      name: '一级',
      component: resolve => require(['@/components/Home'], resolve),
      iconCls: "el-icon-menu",
      meta: {
        title: '一级',
        keepAlive: false, // 不需要缓存
        requireAuth: true //表示进入这个路由是需要登录的
      },
      children: [
        {
          path: '/feedback.html',
          component: resolve => require(['@/components/user/feedback'], resolve),
          name: '二级',
          meta: {
            title: '二级',
            keepAlive: false, // 不需要缓存
            requireAuth: true // 添加该字段,表示进入这个路由是需要登录的
          },
            children: [{
          path: '',//这里设置为空
          component: resolve => require(['@/components/user/userChildren'], resolve),
          name: '三级',
          meta: {
            title: '三级',
            keepAlive: false, // 不需要缓存
            requireAuth: true // 添加该字段,表示进入这个路由是需要登录的
          }
        }
      ]
        }
      ]
    }
  ]
})

多路由嵌套

需要注意的是,每个子路由都需要对应一个 标签来存放

我新建了一个main.vue来存放多路由嵌套多个界面

<template>
  <keep-alive>
    <router-view :key="Math.random()"></router-view>
  </keep-alive>
</template>
<script>
</script>
<style>
</style>
### 动态侧边导航栏及面包屑实现 以下是基于 Vue3 和 `ant-design-vue` 的动态侧边导航栏与面包屑组件的实现方法。通过路由配置自动生成菜单和面包屑。 #### 1. 安装依赖 首先安装必要的依赖包: ```bash npm install vue-router@next ant-design-vue ``` #### 2. 配置路由 定义路由时,需为每个路由添加 `meta` 属性来描述菜单名称和父级关系。 ```javascript // router/index.js import { createRouter, createWebHistory } from 'vue-router'; const routes = [ { path: '/', name: 'Home', component: () => import('@/views/Home.vue'), meta: { title: '首页', breadcrumb: ['首页'] } }, { path: '/about', name: 'About', component: () => import('@/views/About.vue'), meta: { title: '关于我们', breadcrumb: ['首页', '关于我们'] } }, { path: '/settings', name: 'Settings', redirect: '/settings/profile', component: () => import('@/views/Settings/Index.vue'), children: [ { path: 'profile', name: 'Profile', component: () => import('@/views/Settings/Profile.vue'), meta: { title: '个人资料', breadcrumb: ['首页', '设置', '个人资料'] } }, { path: 'security', name: 'Security', component: () => import('@/views/Settings/Security.vue'), meta: { title: '安全设置', breadcrumb: ['首页', '设置', '安全设置'] } } ], meta: { title: '设置', breadcrumb: ['首页', '设置'] } } ]; export default createRouter({ history: createWebHistory(), routes, }); ``` #### 3. 创建布局组件 创建一个包含侧边导航栏和面包屑的 Layout 组件。 ```vue <template> <a-layout style="min-height: 100vh"> <!-- 左侧导航 --> <a-layout-sider collapsible v-model:collapsed="collapsed"> <div class="logo">Logo</div> <a-menu theme="dark" mode="inline" :selectedKeys="[currentRoute.name]" @click="handleMenuClick"> <template v-for="(item, index) in menuData" :key="index"> <a-sub-menu v-if="item.children && item.children.length > 0" :key="item.path"> <template #title>{{ item.meta.title }}</template> <a-menu-item v-for="child in item.children" :key="child.path">{{ child.meta.title }}</a-menu-item> </a-sub-menu> <a-menu-item v-else :key="item.path">{{ item.meta.title }}</a-menu-item> </template> </a-menu> </a-layout-sider> <!-- 主体部分 --> <a-layout-content style="margin: 16px; padding: 16px;"> <!-- 面包屑 --> <a-breadcrumb style="margin-bottom: 16px;" separator="/"> <a-breadcrumb-item v-for="(crumb, idx) in breadcrumbs" :key="idx">{{ crumb }}</a-breadcrumb-item> </a-breadcrumb> <!-- 页面内容 --> <router-view /> </a-layout-content> </a-layout> </template> <script> import { computed, ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; export default { setup() { const route = useRoute(); const router = useRouter(); // 当前路由对象 const currentRoute = computed(() => route); // 是否折叠菜单 const collapsed = ref(false); // 获取菜单数据 (过滤掉不需要显示在菜单中的路由) const menuData = computed(() => router.getRoutes().filter(route => route.meta?.title).map(r => ({ ...r })) ); // 处理菜单点击事件 function handleMenuClick({ key }) { router.push(key); } // 计算当前面包屑路径 const breadcrumbs = computed(() => { return currentRoute.value.meta.breadcrumb || []; }); return { collapsed, menuData, currentRoute, breadcrumbs, handleMenuClick }; } }; </script> <style scoped> .logo { height: 32px; background: rgba(255, 255, 255, 0.2); margin: 16px; } </style> ``` 上述代码实现了以下功能: - **动态生成菜单**:从路由表中提取具有 `meta.title` 的路由作为菜单项[^1]。 - **支持多级嵌套菜单**:如果某个路由有子路由,则会自动将其渲染为下拉菜单[^2]。 - **面包屑展示**:根据当前路由的 `meta.breadcrumb` 字段生成面包屑[^3]。 #### 4. 应用入口 最后,在应用入口文件中引入并注册路由器以及根组件。 ```javascript // main.js import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/reset.css'; createApp(App) .use(Antd) .use(router) .mount('#app'); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值