Angular 6 breadcrumb 面包屑

一、前期準(zhǔn)備

  1. 面包屑組件(最好能封裝成共享組件)
  2. 一些路由信息配置
  3. Ant-Zorro 組件的環(huán)境配置(這里會(huì)套用里面的一些現(xiàn)成的組件庫),版本: 7.0.1

二、Ant-Zorro 配置

這里請參考官方網(wǎng)站 https://ng.ant.design/docs/getting-started/zh 泡孩,官方網(wǎng)站中,找到目錄 快速上手 寺谤,在里面有 自行構(gòu)建仑鸥,查看 自行構(gòu)建 下的內(nèi)容。

如果依然不能成功变屁,可以瀏覽參考博主的另一個(gè)博客:
里面講了一些博主在配置 Ant-Zorro 的時(shí)候遇到的坑眼俊!

三、自定義面包屑組件

1. 創(chuàng)建一個(gè)自己的面包屑組件

ng g c breadcrumb --spec=false

2. 使用 Ant-Zorro 的面包屑組件

<nz-breadcrumb>
    <nz-breadcrumb-item>Home</nz-breadcrumb-item>
    <nz-breadcrumb-item><a>Application List</a></nz-breadcrumb-item>
    <nz-breadcrumb-item>An Application</nz-breadcrumb-item>
</nz-breadcrumb>

將 Ant-Zorro 組件庫中的面包屑組件粟关,放到自己創(chuàng)建的面包屑組件的html文件中疮胖。將組件庫中的面包屑做一點(diǎn)改動(dòng),將靜態(tài)的面包屑改成動(dòng)態(tài)的闷板,使用 ngFor 循環(huán)自行加載澎灸,對應(yīng)的路由信息。

<nz-breadcrumb>
  <nz-breadcrumb-item>首頁</nz-breadcrumb-item>
  <nz-breadcrumb-item *ngFor="let breadcrumb of breadcrumbs">
    <a [routerLink]="[breadcrumb.url, breadcrumb.params]">{{ breadcrumb.label }}</a>
  </nz-breadcrumb-item>
</nz-breadcrumb>

3. 面包屑邏輯代碼

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute, NavigationEnd, Params, PRIMARY_OUTLET } from '@angular/router';
import { filter } from 'rxjs/operators';

interface IBreadcrumb {
  label: string;
  params: Params;
  url: string;
}

@Component({
  selector: 'app-breadcrumb',
  templateUrl: './breadcrumb.component.html',
  styleUrls: ['./breadcrumb.component.scss']
})

export class BreadcrumbComponent implements OnInit {
  public breadcrumbs: IBreadcrumb[];

  constructor(
    private activatedRoute: ActivatedRoute,
    private router: Router
  ) {
    this.breadcrumbs = [];
  }

  ngOnInit() {
    // 訂閱NavigationEnd事件
    this.router.events.pipe(filter(event => event instanceof NavigationEnd))
      .subscribe(event => {
        // 設(shè)置面包屑
        const root: ActivatedRoute = this.activatedRoute.root;
        console.log('=== janine.樹的的根路由', root);
        this.breadcrumbs = this.getBreadcrumbs(root);
      });
  }

  /**
   * 返回表示面包屑的IBreadcrumb對象的數(shù)組
   */
  private getBreadcrumbs(route: ActivatedRoute, url: string = '', breadcrumbs: IBreadcrumb[] = []): IBreadcrumb[] {
    const ROUTE_DATA_BREADCRUMB = 'breadcrumb';

    // 得到子路由
    const children: ActivatedRoute[] = route.children;
    console.log('=== janine.有多少子路由 ===', children);

    // 如果沒有子路由返回
    if (children.length === 0) {
      console.log('=== janine.沒有子路由是 ===', breadcrumbs);
      return breadcrumbs;
    }

    // 遍歷每個(gè)子元素
    for (const child of children) {
      // 驗(yàn)證主路由
      if (child.outlet !== PRIMARY_OUTLET) {
        continue;
      }

      // 驗(yàn)證路由上指定的自定義數(shù)據(jù)屬性'breadcrumb'
      if (!child.snapshot.data.hasOwnProperty(ROUTE_DATA_BREADCRUMB)) {
        return this.getBreadcrumbs(child, url, breadcrumbs);
      }

      // 獲取路由的URL進(jìn)行分割
      const routeURL: string = child.snapshot.url.map(segment => segment.path).join('/');
      // append route URL to URL 追加路由的url到url
      if (routeURL) {
        console.log('=== janine.routeURL ===', routeURL);
        url += `/${routeURL}`;
      }

      // 添加面包屑
      const breadcrumb: IBreadcrumb = {
        label: child.snapshot.data[ROUTE_DATA_BREADCRUMB],
        params: child.snapshot.params,
        url: url
      };
      // 此處的 component 如果為 undefined遮晚,可能是因?yàn)閼屑虞d性昭,在查找時(shí),沒有找到 component 的值鹏漆,
      // 所以當(dāng) component 為 undefined 的時(shí)候,就會(huì)又往數(shù)組里再追加一次创泄,會(huì)重復(fù)
      if (child.component) {
        breadcrumbs.push(breadcrumb);
      }

      console.log('=== janine.breadcrumbs === ', breadcrumb);

      // 遞歸
      return this.getBreadcrumbs(child, url, breadcrumbs);
    }
  }

}

4. 知識(shí)點(diǎn)

(1) filter

import { filter } from 'rxjs/operators';

rxjs 的 filter() 方法艺玲,是 Angular6的,不是其他版本鞠抑,如果版本不對饭聚,會(huì)出錯(cuò)! 對應(yīng)的使用步驟如下:

ngOnInit() {
    // 訂閱NavigationEnd事件
    this.router.events.pipe(filter(event => event instanceof NavigationEnd))
      .subscribe(event => {
        // 設(shè)置面包屑
        const root: ActivatedRoute = this.activatedRoute.root;
        console.log('=== janine.樹的的根路由', root);
        this.breadcrumbs = this.getBreadcrumbs(root);
      });
  }

(2)NavigationEnd, Params, PRIMARY_OUTLET

Router 和 ActivatedRoute 就不說了,這是 Angular 路由最常見的搁拙。講一下 NavigationEnd, Params, PRIMARY_OUTLET秒梳。

  • NavigationEnd:表示當(dāng)導(dǎo)航 成功結(jié)束 時(shí)(當(dāng)從一個(gè)路徑到另一個(gè)導(dǎo)航已經(jīng)完成時(shí))觸發(fā)的事件法绵。
  • Params:用來設(shè)置 IBreadcrumb 接口的 params 的類型為 Params。params 為非必需酪碘,其他兩個(gè)為必需的朋譬。
interface IBreadcrumb {
  label: string;
  params: Params;
  url: string;
}
  • PRIMARY_OUTLET:一個(gè)常量 primary

(3) 添加面包屑

代碼中,有一段是將路由追加到數(shù)組中兴垦。這里會(huì)有一個(gè)關(guān)于懶加載的問題徙赢,代碼注釋里已經(jīng)說明了。

如果有懶加載就得加個(gè)判讀 child.component 是否 為 undefined 探越,只有不是 undefined 時(shí)才能向數(shù)組中追加狡赐,否則會(huì)重復(fù)(這里可以去掉判斷,自己 debugger 一下钦幔,關(guān)注一下 component 值的變化枕屉,和數(shù)組追加后數(shù)組值的變化情況)。

如果沒有懶加載鲤氢,可以不對 breadcrumbs.push(breadcrumb); 做判斷搀擂!

// 添加面包屑
const breadcrumb: IBreadcrumb = {
    label: child.snapshot.data[ROUTE_DATA_BREADCRUMB],
    params: child.snapshot.params,
    url: url
};
// 此處的 component 如果為 undefined,可能是因?yàn)閼屑虞d铜异,在查找時(shí)哥倔,沒有找到 component 的值,
// 所以當(dāng) component 為 undefined 的時(shí)候揍庄,就會(huì)又往數(shù)組里再追加一次咆蒿,會(huì)重復(fù)
if (child.component) {
    breadcrumbs.push(breadcrumb);
}

5. 路由信息配置: data: { breadcrumb: 'xxx' }

export const routes = [
    {
        // 路由為空時(shí),自動(dòng)重定向到/home
        path: '',
        redirectTo: '/home/basic',
        pathMatch: 'full',
    },
    {
        path: 'home', component: HomeComponent,
        children: [
            {
                path: 'basic', loadChildren: './basic/basic.module#BasicModule',
                data: { breadcrumb: '基礎(chǔ)' }
            },
            ...
            {
                path: 'server', loadChildren: './server/server.module#ServerModule',
                data: { breadcrumb: '服務(wù)' }
            }
        ]
    },
];

如果模塊中蚂子,還有子路由沃测,也是同樣配置!

6. 效果圖:

路由面包屑.gif

附錄

源碼地址:https://github.com/Janine-ZN/ng-basic (重點(diǎn):breadcrumb.component.ts 和 routes.ts,還有一些模塊中的路由配置)

參考的博客是針對 Angular2 的食茎,而且不適用于路由懶加載蒂破,如果有路由懶加載的地方頁面可能會(huì)出重復(fù)的路由。

博客參考地址:
https://yfblog.cn/angular2-breadcrumb-using-router.html


關(guān)注博主公眾號别渔,更多精彩等著你8矫浴!哎媚!


公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喇伯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拨与,更是在濱河造成了極大的恐慌稻据,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买喧,死亡現(xiàn)場離奇詭異捻悯,居然都是意外死亡匆赃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門今缚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算柳,“玉大人,你說我怎么就攤上這事荚斯〔壕樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵事期,是天一觀的道長滥壕。 經(jīng)常有香客問我,道長兽泣,這世上最難降的妖魔是什么绎橘? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮唠倦,結(jié)果婚禮上称鳞,老公的妹妹穿的比我還像新娘。我一直安慰自己稠鼻,他們只是感情好冈止,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著候齿,像睡著了一般熙暴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慌盯,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天周霉,我揣著相機(jī)與錄音,去河邊找鬼亚皂。 笑死俱箱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灭必。 我是一名探鬼主播狞谱,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼禁漓!你這毒婦竟也來了跟衅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤璃饱,失蹤者是張志新(化名)和其女友劉穎与斤,沒想到半個(gè)月后肪康,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荚恶,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撩穿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谒撼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片食寡。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖廓潜,靈堂內(nèi)的尸體忽然破棺而出抵皱,到底是詐尸還是另有隱情,我是刑警寧澤辩蛋,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布呻畸,位于F島的核電站,受9級特大地震影響悼院,放射性物質(zhì)發(fā)生泄漏伤为。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一据途、第九天 我趴在偏房一處隱蔽的房頂上張望绞愚。 院中可真熱鬧,春花似錦颖医、人聲如沸位衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糖驴。三九已至,卻和暖如春哪痰,著一層夾襖步出監(jiān)牢的瞬間遂赠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工晌杰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跷睦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓肋演,卻偏偏與公主長得像抑诸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子爹殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • 一:路由基礎(chǔ) 什么是路由: 在web開發(fā)中蜕乡,路由的概念由來已久,簡而言之梗夸,就是利用URL的唯一性來指定特定的事物层玲,...
    真的稻城閱讀 6,005評論 2 7
  • 一.課程簡介 (注意:這里的AngularJS指的是2.0以下的版本) AngularJS的優(yōu)點(diǎn): 模板功能強(qiáng)大豐...
    壹點(diǎn)微塵閱讀 906評論 0 0
  • 主題: 導(dǎo)航欄和一級菜單面包屑 導(dǎo)航欄 導(dǎo)航欄作為通用組件,把它放在conponets文件夾下并新起一個(gè)文件夾ma...
    酸蘿卜閱讀 6,285評論 3 1
  • 路由與導(dǎo)航 在用戶使用應(yīng)用程序時(shí),Angular 的路由器能讓用戶從一個(gè)視圖導(dǎo)航到另一個(gè)視圖。 概覽 Angula...
    chrisghb閱讀 4,103評論 0 0
  • 一辛块、具體需求: 1. 頁面布局 左側(cè)導(dǎo)航畔派,右側(cè)側(cè)邊輔助菜單,中間主業(yè)務(wù)界面润绵;左側(cè)導(dǎo)航是根據(jù)用戶權(quán)限動(dòng)態(tài)生成的线椰。 2...
    環(huán)零弦閱讀 8,775評論 0 3