vue動態(tài)面包屑路由組件實(shí)現(xiàn)

vue動態(tài)面包屑路由組件實(shí)現(xiàn)洼专,無污染、易配置

這幾天開發(fā)一個(gè)vue項(xiàng)目孵构,因?yàn)轫撁娣浅6嗥ㄉ蹋矣忻姘夹枨?/p>

開始想法:<適用于有面包屑的頁面少的情況> 每個(gè)頁面用vue路由傳參實(shí)現(xiàn),每次跳轉(zhuǎn)傳參颈墅,頁面根據(jù)參數(shù)設(shè)置面包屑路由蜡镶;

后來想法:規(guī)劃好路由,將路由和面包屑一一對應(yīng)起來恤筛,頁面加載后解析路由官还,組合成面包屑即可(如下圖),路由的名稱是對應(yīng)起來添加到配置中

下面是我的兩種思路和組件實(shí)現(xiàn)(至于面包屑的樣式實(shí)現(xiàn)并不難毒坛,這里直接用elemetUI組件的望伦,我主要是說動態(tài)面包屑思路,并不是面包屑樣式,如果UI組件不同粘驰,只需要自己做一些簡單修改即可):

實(shí)現(xiàn):
breadBox1.0.vue:

<!--
v1.0 
breadBox 路由配置好屡谐,面包屑直接對應(yīng)
-->
<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 {
        //手動配置項(xiàng):breadListIm為路由與面包屑名稱對應(yīng)關(guān)系,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 = ''
          //刪除掉數(shù)組的前1個(gè)度秘,提升遍歷性能
          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>



優(yōu)點(diǎn):插拔輕松唆貌,容易配置(樣式現(xiàn)在基于elementUI,完全可以改成任意面包屑組件)
直接將breadBox放在 router/index.js 的路由中間即可,當(dāng)然氮兵,上一層組件模塊要加上 <router-view></router-view>

image.png

v1.0效果

最后:上面的思路親測可行挤忙,配合vue-router的path和redirect用的不錯(cuò),但考慮到可能會出現(xiàn)重復(fù)路由配置過多酪刀,又寫了一版兼容開始的想法粹舵,
當(dāng)然這次吸取教訓(xùn),將配置路由也提了出來骂倘。
更適合于路由沒有規(guī)劃的項(xiàng)目眼滤,拿來即用。

breadBox2.0.vue:

<!--
breadBox v2.0  說明:1.0和2.0選擇一種方法配置動態(tài)路由即可
1.0 breadBox 面包屑跟隨路由變化,此方法需要面包屑與路由顯示順序一致历涝,例如path:01/02/03 面包屑也是01/02/03,
2.0 增加路由參數(shù)配置項(xiàng)诅需,動態(tài)面包屑,面包屑跟隨參數(shù)變化
(2.0方法雖然萬能荧库,但在頁面過多的時(shí)候不推薦堰塌,每次路由跳轉(zhuǎn)帶上面包屑參數(shù)會造成麻煩
  2.0推薦使用情況:在路由和面包屑根本對不上,重定向也不好用的時(shí)候分衫,或者重復(fù)路由配置過多的场刑,或者僅一兩個(gè)頁面有面包屑又想引入此組件的)
優(yōu)點(diǎn):插拔輕松,容易配置(樣式基于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手動配置項(xiàng):breadListIm為路由與面包屑名稱對應(yīng)關(guān)系,breadLoadName為面包屑組件路由
        //v2.0手動配置項(xiàng):breadListParam為路由與面包屑名稱對應(yīng)關(guān)系,breadBoxIdName為路由參數(shù)名
        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 = []
        //獲取參數(shù)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 = ''
            //刪除掉數(shù)組的前1個(gè),提升遍歷性能
            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效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末概漱,一起剝皮案震驚了整個(gè)濱河市丑慎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓤摧,老刑警劉巖竿裂,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異照弥,居然都是意外死亡腻异,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門这揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悔常,“玉大人影斑,你說我怎么就攤上這事』颍” “怎么了矫户?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長残邀。 經(jīng)常有香客問我皆辽,道長,這世上最難降的妖魔是什么芥挣? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任驱闷,我火速辦了婚禮,結(jié)果婚禮上九秀,老公的妹妹穿的比我還像新娘遗嗽。我一直安慰自己,他們只是感情好鼓蜒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布痹换。 她就那樣靜靜地躺著,像睡著了一般都弹。 火紅的嫁衣襯著肌膚如雪娇豫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天畅厢,我揣著相機(jī)與錄音冯痢,去河邊找鬼。 笑死框杜,一個(gè)胖子當(dāng)著我的面吹牛浦楣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咪辱,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼振劳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油狂?” 一聲冷哼從身側(cè)響起历恐,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎专筷,沒想到半個(gè)月后弱贼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷蛹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年吮旅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味咳。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸟辅,死狀恐怖氛什,靈堂內(nèi)的尸體忽然破棺而出莺葫,到底是詐尸還是另有隱情匪凉,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布捺檬,位于F島的核電站再层,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堡纬。R本人自食惡果不足惜聂受,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烤镐。 院中可真熱鬧蛋济,春花似錦、人聲如沸炮叶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜悉。三九已至祟辟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侣肄,已是汗流浹背旧困。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稼锅,地道東北人吼具。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像矩距,于是被迫代替她去往敵國和親拗盒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容