美文网首页
Vue后台面包屑导航实现

Vue后台面包屑导航实现

作者: LuoDada | 来源:发表于2020-07-29 11:55 被阅读0次
    1. 基础知识
    $route.matched  类型: Array<RouteRecord>
    一个数组,包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。
    const router = new VueRouter({
      routes: [
        // 下面的对象就是路由记录
        {
          path: '/foo',
          component: Foo,
          children: [
            // 这也是个路由记录
            { path: 'bar', component: Bar }
          ]
        }
      ]
    })
    当 URL 为 /foo/bar,$route.matched 将会是一个包含从上到下的所有对象 (副本)。
    
    1. 代码 (项目使用的时element-ui的el-breadcrumb组件)
    <template>
      <el-breadcrumb separator="/">
        <!-- 添加动画 -->
        <transition-group name="breadcrumb">
          <el-breadcrumb-item v-for="(item, index) of list" :key="item.path">
            <span v-if="index == list.length - 1">{{ item.meta.title }}</span>
            <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
          </el-breadcrumb-item>
        </transition-group>
      </el-breadcrumb>
    </template>
    
    <script>
    import pathToRegexp from 'path-to-regexp'
    export default {
      data() {
        return {
          list: []
        }
      },
      watch: {
        // 当路由发生改变时执行
        $router() {
          this.getBreadcrumb()
        }
      },
      // 首次执行
      created() {
        this.getBreadcrumb()
      },
      methods: {
        getBreadcrumb() {
          // matched 包含当前路由的所有嵌套路径片段的路由记录<Array>
          let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
          const first = matched[0]
          // 默认显示Home,可根据项目自行调整
          if (!this.isHome(first)) {
            matched = [{ path: '/home', meta: { title: '首页' }}].concat(matched)
          }
          this.list = matched
        },
        isHome(route) {
          const name = route && route.name
          if (!name) {
            return false
          }
          return name.trim().toLocaleLowerCase() === 'Home'
        },
        handleLink(item) {
          const { redirect, path } = item
          // 优先执行redirect指定路径
          if (redirect) {
            this.$router.push(redirect)
            return
          }
          this.$router.push(this.pathCompile(path))
        },
        pathCompile(path) {
          // 解决面包屑不支持:id的方式 https://github.com/PanJiaChen/vue-element-admin/issues/561
          const { params } = this.$route
          const toPach = pathToRegexp.compile(path)
          return toPach(params)
        }
      }
    }
    </script>
    

    相关文章

      网友评论

          本文标题:Vue后台面包屑导航实现

          本文链接:https://www.haomeiwen.com/subject/kzdhrktx.html