Dev Study
← 解説「routerLink — 画面遷移のリンクを作る」に戻る

サンプルコードで身につける: routerLink — 画面遷移のリンクを作る

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1基本のナビゲーションリンク

routerLink の最小構成で、href の代わりに routerLink を使ったリンク集です。RouterLink を imports に追加し、パスを文字列で指定するだけで、再読み込みのないSPAらしい遷移になります。ヘッダーやサイドバーのメニューは、実務でもまずこの形から始まります。

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-header',
  imports: [RouterLink],
  // href ではなく routerLink で書くのがAngularの基本
  template:
    '<nav>' +
    '  <a routerLink="/">ホーム</a>' +
    '  <a routerLink="/products">商品一覧</a>' +
    '  <a routerLink="/contact">お問い合わせ</a>' +
    '</nav>',
})
export class HeaderComponent {}

2配列形式でパラメータ付きのリンクを作る

[routerLink] に配列を渡すと、クラスの値を組み込んだ /books/1 のようなURLを組み立てられます。一覧の各行から詳細ページへ飛ばすという実務の定番パターンで、@for で回した各データのIDをそのままリンクにできます。文字列連結で href を作るより安全で読みやすい書き方です。

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-book-list',
  imports: [RouterLink],
  // 配列の要素がつながって /books/1 のようなURLになる
  template:
    '<ul>' +
    '  @for (book of books; track book.id) {' +
    '    <li><a [routerLink]="[\'/books\', book.id]">{{ book.title }}</a></li>' +
    '  }' +
    '</ul>',
})
export class BookListComponent {
  books = [
    { id: 1, title: 'Angular入門' },
    { id: 2, title: 'TypeScript実践' },
  ];
}

3routerLinkActive で現在地を強調する

表示中のURLとリンク先が一致したときだけ、指定したクラスが自動で付きます。ナビゲーションメニューで「今いるページ」を太字や下線で示す、実務では必ずと言っていいほど使う機能です。ホーム(/)はどのURLにも前方一致してしまうので、exact: true で完全一致に絞るのがお約束です。

import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';

@Component({
  selector: 'app-global-nav',
  imports: [RouterLink, RouterLinkActive],
  // 表示中のURLと一致するリンクにだけ current クラスが付く
  template:
    '<nav>' +
    '  <a routerLink="/" routerLinkActive="current"' +
    '     [routerLinkActiveOptions]="{ exact: true }">ホーム</a>' +
    '  <a routerLink="/news" routerLinkActive="current">ニュース</a>' +
    '  <a routerLink="/mypage" routerLinkActive="current">マイページ</a>' +
    '</nav>',
  styles: ['.current { font-weight: bold; border-bottom: 2px solid teal; }'],
})
export class GlobalNavComponent {}

4[queryParams] でクエリ付きリンクを作る

routerLink と [queryParams] を組み合わせると、/items?sort=new のような ? 以降を持つリンクになります。並び替えや絞り込みの条件をURLに載せる実務パターンで、リンク先のコンポーネントは queryParamMap で値を受け取ります。条件がURLに残るので、その状態のまま共有・ブックマークできるのが利点です。

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-sort-links',
  imports: [RouterLink],
  // [queryParams] のオブジェクトが ? 以降のクエリ文字列になる
  template:
    '<nav>' +
    '  <a routerLink="/items" [queryParams]="{ sort: \'new\' }">新着順</a>' +
    '  <a routerLink="/items"' +
    '     [queryParams]="{ sort: \'price\', order: \'asc\' }">価格が安い順</a>' +
    '</nav>',
})
// 1つ目は /items?sort=new、2つ目は /items?sort=price&order=asc へのリンクになる
export class SortLinksComponent {}

5アプリ内は routerLink、外部サイトは href

routerLink はあくまでアプリ内のルート定義に対する遷移で、外部サイトへは従来どおり href を使います。アプリ内リンクを href で書くとページ全体が再読み込みされてSPAの軽快さが失われる、という違いを1つのフッターで対比した例です。外部リンクに target="_blank" を付けるときは rel="noopener" もセットにするのが実務の習慣です。

import { Component } from '@angular/core';
import { RouterLink } from '@angular/router';

@Component({
  selector: 'app-footer-links',
  imports: [RouterLink],
  template:
    '<footer>' +
    // アプリ内のページ: routerLink なら再読み込みなしで切り替わる
    '  <a routerLink="/terms">利用規約</a>' +
    // 外部サイト: ルート定義の外なので href を使う
    '  <a href="https://angular.jp" target="_blank" rel="noopener">' +
    '    公式ドキュメント' +
    '  </a>' +
    '</footer>',
})
export class FooterLinksComponent {}