vue动态面包屑路由组件实现

vue动态面包屑路由组件实现,无污染、易配置

这几天开发一个vue项目,因为页面非常多,而且有面包屑需求

开始想法:<适用于有面包屑的页面少的情况> 每个页面用vue路由传参实现,每次跳转传参,页面根据参数设置面包屑路由;

后来想法:规划好路由,将路由和面包屑一一对应起来,页面加载后解析路由,组合成面包屑即可(如下图),路由的名称是对应起来添加到配置中

下面是我的两种思路和组件实现(至于面包屑的样式实现并不难,这里直接用elemetUI组件的,我主要是说动态面包屑思路,并不是面包屑样式,如果UI组件不同,只需要自己做一些简单修改即可):

实现:
breadBox1.0.vue:

<!--
v1.0 
breadBox 路由配置好,面包屑直接对应
-->
<template>
  <div class="breadEval">
    <div class="breadTitle">
      <el-breadcrumb separator="/">
        <el-breadcrumb-item>您的位置:</el-breadcrumb-item>
        <el-breadcrumb-item :to="item.path" v-for="item of breadListLast" :key="item.path">
          {{item.name}}
        </el-breadcrumb-item>
      </el-breadcrumb>
    </div>
    <router-view></router-view>
  </div>
</template>
<script>
  export default {
    //面包屑解决方案,此方法只适用于面包屑与路由显示顺序一致,例如path:01/02/03 面包屑也是01/02/03
    data() {
      return {
        //手动配置项:breadListIm为路由与面包屑名称对应关系,breadLoadName为面包屑组件路由
        breadLoadName: '/breadBox',
        breadListIm: [
          {
            path: '01',
            name: '一级'
          },
          {
            path: '02',
            name: '二级'
          },
          {
            path: '03',
            name: '三级'
          },
        ],
        breadListLast: []
      };
    },
    methods: {
      loadChange() {
        this.breadListLast = []
        if (this.$route.path.indexOf(this.breadLoadName) === -1) {
          console.log('面包屑路由地址breadLoadName没有配置正确!')
        } else {
          let breadListAgo = this.$route.path.split(this.breadLoadName)
          // let breadListAgo = '/index/indexSchool/breadList/01/02/03'.split(this.breadLoadName)
          let breadList = breadListAgo[1].split('/')
          let obje = {}
          let breadIndex = ''
          //删除掉数组的前1个,提升遍历性能
          breadList.splice(0, 1)
          //考虑到顺序问题,只能先遍历breadList,再遍历breadListIm
          for (let p of breadList) {
            for (let q of this.breadListIm) {
              if (p === q.path) {
                breadIndex += '/' + q.path
                obje.path = breadListAgo[0] + this.breadLoadName + breadIndex
                obje.name = q.name
                this.breadListLast.push(obje)
                obje = {}
              }
            }
          }
          // 打印路由配置
          // console.log(JSON.stringify(this.breadListLast)) 
        }
      }
    },
    watch: {
      $route(to, from) {
        this.loadChange()
        // console.log(to.path);
      }
    },
    //页面挂载之后,解析路由,给出面包屑,路由里面一定要含有breadCom组件的path
    mounted: function () {
      this.loadChange()
    }
  };
</script>
<style lang="scss" scoped>
  .breadEval {
    position: relative;
    font-size: 14px;
    height: 100%;
    background: #F3F7FD;
    .breadTitle{
      padding: 20px 30px;
      background: #fff;
    }
  }
</style>



优点:插拔轻松,容易配置(样式现在基于elementUI,完全可以改成任意面包屑组件)
直接将breadBox放在 router/index.js 的路由中间即可,当然,上一层组件模块要加上 <router-view></router-view>

image.png

v1.0效果

最后:上面的思路亲测可行,配合vue-router的path和redirect用的不错,但考虑到可能会出现重复路由配置过多,又写了一版兼容开始的想法,
当然这次吸取教训,将配置路由也提了出来。
更适合于路由没有规划的项目,拿来即用。

breadBox2.0.vue:

<!--
breadBox v2.0  说明:1.0和2.0选择一种方法配置动态路由即可
1.0 breadBox 面包屑跟随路由变化,此方法需要面包屑与路由显示顺序一致,例如path:01/02/03 面包屑也是01/02/03,
2.0 增加路由参数配置项,动态面包屑,面包屑跟随参数变化
(2.0方法虽然万能,但在页面过多的时候不推荐,每次路由跳转带上面包屑参数会造成麻烦
  2.0推荐使用情况:在路由和面包屑根本对不上,重定向也不好用的时候,或者重复路由配置过多的,或者仅一两个页面有面包屑又想引入此组件的)
优点:插拔轻松,容易配置(样式基于elementUI)
-->
<template>
  <div class="breadEval">
    <div class="breadTitle">
      <el-breadcrumb separator="/">
        <el-breadcrumb-item>您的位置:</el-breadcrumb-item>
        <el-breadcrumb-item :to="item.path" v-for="item of breadListLast" :key="item.path">
          {{item.name}}
        </el-breadcrumb-item>
      </el-breadcrumb>
    </div>
    <router-view></router-view>
  </div>
</template>
<script>
  export default {
    //面包屑解决方案,
    data() {
      return {
        //v1.0手动配置项:breadListIm为路由与面包屑名称对应关系,breadLoadName为面包屑组件路由
        //v2.0手动配置项:breadListParam为路由与面包屑名称对应关系,breadBoxIdName为路由参数名
        breadLoadName: '/breadBox',
        breadListIm: [
          {
            path: '01',
            name: '一级'
          },
          {
            path: '02',
            name: '二级'
          },
          {
            path: '03',
            name: '三级'
          },
        ],
        breadListParam:{
          "1":[{path:"/home/01",name:"一级01"},
              {path:"/home/02/01",name:"二级01"},
              {path:"/home/03/02/01",name:"三级01"}],
          "2":[{path:"/home/01",name:"一级02"},
              {path:"/home/02/01",name:"二级02"},
              {path:"/home/03/02/01",name:"三级02"}]
        },
        breadBoxIdName:'breadBoxId',
        breadListLast: [],
      };
    },
    methods: {
      loadChange() {
        this.breadListLast = []
        //获取参数breadBoxId值
        let breadBoxId = this.$route.query[this.breadBoxIdName]
        console.log(breadBoxId)
        if( undefined == breadBoxId || breadBoxId == null || '' == breadBoxId ){
          if (this.$route.path.indexOf(this.breadLoadName) === -1) {
            console.log('面包屑路由地址breadLoadName没有配置正确!')
          } else {
            let breadListAgo = this.$route.path.split(this.breadLoadName)
            // let breadListAgo = '/index/indexSchool/breadList/01/02/03'.split(this.breadLoadName)
            let breadList = breadListAgo[1].split('/')
            let obje = {}
            let breadIndex = ''
            //删除掉数组的前1个,提升遍历性能
            breadList.splice(0, 1)
            //考虑到顺序问题,只能先遍历breadList,再遍历breadListIm
            for (let p of breadList) {
              for (let q of this.breadListIm) {
                if (p === q.path) {
                  breadIndex += '/' + q.path
                  obje.path = breadListAgo[0] + this.breadLoadName + breadIndex
                  obje.name = q.name
                  this.breadListLast.push(obje)
                  obje = {}
                }
              }
            }
          };
        }else{
          this.breadListLast =  this.breadListParam[breadBoxId]
        }
        // 打印路由配置
        console.log(JSON.stringify(this.breadListLast)) 
      }
    },
    watch: {
      $route(to, from) {
        this.loadChange()
        // console.log(to.path);
      }
    },
    //页面挂载之后,解析路由,给出面包屑,路由里面一定要含有breadCom组件的path
    mounted: function () {
      this.loadChange()
    }
  };
</script>
<style lang="scss" scoped>
  .breadEval {
    position: relative;
    font-size: 14px;
    height: 100%;
    background: #F3F7FD;
    .breadTitle{
      padding: 20px 30px;
      background: #fff;
    }
  }
</style>
V2.0效果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 本文首发于TalkingCoder,一个有逼格的程序员社区。转载请注明出处和作者。 写在前面 本文为系列文章,总共...
    Aresn阅读 9,498评论 0 42
  • 实用框架以及工具 UI组件[#UI%E7%BB%84%E4%BB%B6] 开发框架[#%E5%BC%80%E5%8...
    youins阅读 12,758评论 4 133
  • 西秦木子抒情诗集《守望者》目录 一经产生 便如一粒种子 在心里发芽 日夜疯长 葳蕤生光 冲出眼睛 巨大的花朵 覆盖...
    西秦木子阅读 140评论 0 4
  • 苏打绿有一张专辑叫你在烦恼什么,发行于2011年冬季,里面有两首我非常喜欢的歌——喜欢寂寞和你被写在我的歌里。 ...
    酒酒27阅读 231评论 0 0
  • (一) 我是一颗鸟蛋,不知道是什么品种的鸟蛋。 我是有意识的,我知道我的周围全是黑暗,我能听到外面有亲切的唧唧声,...
    城南花开亦城北阅读 577评论 0 0