この記事ではRouter.navigate
メソッドを用いて以下のパラメータを渡す方法を説明しています。
- ルートパラメータ
- クエリパラメータ
- URLフラグメント
- マトリクスURLパラメータ
プログラム例を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。
Router.navigate メソッドでパラメータを渡す方法
Router.navigate メソッドはAngularの中で使用されるルート(URL)の変更を行うメソッドです。
Router.navigate
メソッドで渡すことができる主なパラメータの種類とその説明を以下に示します。
Router.navigate メソッドで渡すことができるパラメータ
- ルートパラメータ
- URLの一部として動的に渡される値です。
- 例えば、
/user/:id
というルートがある場合、this.router.navigate(['/user', 123])
と記述すると、id
パラメータに123
を渡すことができます。
- クエリパラメータ
- URLの末尾に
?
で始まる「キー/値」のペアとして渡される値です。 - 例えば、
this.router.navigate(['/main'], { queryParams: { category: 'Angular' } })
と記述すると、/main?category=angular
というURLを生成することができます。
- URLの末尾に
- URLフラグメント
- URLの末尾の
#
で始まる値です。 - 例えば、
this.router.navigate(['/main'], { fragment: 'Angular' })
と記述すると、/main#Angular
というURLを生成することができます。
- URLの末尾の
- マトリクスURLパラメータ
- URLの特定のセグメントの中に
;
で始まる「キー/値」のペアとして渡される値です。 - 例えば、
this.router.navigate(['/main', { category: 'Angular' }])
と記述すると、/main;category=Angular
というURLを生成することができます。
- URLの特定のセグメントの中に
ではこれから各パラメータの渡し方と受け取り方を実際のプログラム例で説明します。
あわせて読みたい
Router.navigateメソッドの基本的な使い方については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見る【Angular】Router.navigate メソッドでルーティングする方法
Router.navigate メソッドでルートパラメータを使う場合
Router.navigate
メソッドでルートパラメータを使う場合のプログラム例を以下に示しています。
app-routing.module.ts
import { NgModule } from '@angular/core';
// RoutesとRouterModuleをインポート
import { Routes, RouterModule } from '@angular/router';
// 遷移先のコンポーネントをインポート
import { MainComponent } from './main.component';
// ルーティングテーブルでパスとコンポーネントの対応付けをする
const routes: Routes = [
{ path: 'main/:id', component: MainComponent }, // ルートパラメータを使う場合
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
「path: 'main/:id'」の部分の「:id」はルートパラメータを示しています。これを通じて動的な値をURLに組み込むことができます。
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">メインページ</button>
<router-outlet></router-outlet>
`,
})
export class AppComponent {
constructor(private router: Router) {}
onClick() {
// ルートパラメータを使う場合
this.router.navigate(['/main', 1]);
}
}
ルートパラメータを渡す際には、以下に示すように配列を使用します。
this.router.navigate(['/main', 1]);
これにより、Router.navigate
メソッドが実行されると、URLは以下のようになります。なお、「http://localhost:4200」の箇所は環境によって変わります(ローカル開発サーバーを使用しており、ポート4200で実行している場合には以下のURLになります)。
http://localhost:4200/main/1
main.component.ts
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
template: `
<!-- ルートパラメータを使う場合 -->
<h1>記事番号 No.{{ id }}</h1>
`,
})
export class MainComponent {
//ルートパラメータを使う場合
id: string | null = null;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.params.subscribe((params) => {
this.id = params['id'];
});
}
}
ルートパラメータを取得する際には、paramsプロパティまたはparamMapプロパティを使用します。上記のプログラムではparams
プロパティを使用して、ルートパラメータを取得しています。
paramMap
プロパティを用いる場合には、以下に示すように記述します。paramMap
プロパティを購読し、get
メソッドを使用してルートパラメータの値を取得します。
ngOnInit() {
this.route.paramMap.subscribe((paramMap) => {
this.id = paramMap.get('id');
});
}
ActivatedRoute
クラスのparamMap
プロパティを使用する場合、取得したルートパラメータはstring
またはnull
の両方の型を持つ可能性があるため、id
の型をstring | null
に変更しています。
ActivatedRouteのsnapshotプロパティを使ってルートパラメータを受け取る場合
ActivatedRoute
クラスのparams
プロパティやparamsMap
プロパティを購読する代わりに、以下に示すようにActivatedRoute
クラスのsnapshot
プロパティを使っても直接ルートパラメータを取得することができます。
これは、コンポーネントが初期化されるときに一度だけルートパラメータを取得する場合に便利です。これを使用すると、ルートパラメータが変更されても再購読することはありません。ルートパラメータがコンポーネントのライフサイクル中で変更されることがない場合に特に役立ちます。
ngOnInit() {
// paramsを使用してルートパラメータを取得
this.id = this.route.snapshot.params['id'];
// paramsMapを使用してルートパラメータを取得
this.id = this.route.snapshot.paramMap.get('id');
}
paramsとparamMapの違い
params
プロパティおよびparamMap
プロパティはどちらもActivatedRoute
クラスのプロパティです。params
プロパティおよびparamMap
プロパティの違いを以下に示します。
params
プロパティ- Observableオブジェクトとしてルートパラメータを提供する
ActivatedRoute
クラスのプロパティです。 - 購読することで現在のルートパラメータの値を取得することができます。
- 取得されるルートパラメータは、
{ key: string}
の形式になります。
- Observableオブジェクトとしてルートパラメータを提供する
paramsMap
プロパティ- Observableオブジェクトとしてルートパラメータを提供する
ActivatedRoute
クラスのプロパティです。 - 購読することで現在のルートパラメータの値を取得することができます。
- 取得されるルートパラメータは、
ParamMap
オブジェクトとして提供されます。ParamMap
オブジェクトは、パラメータをより効果的に操作するためのメソッド(例:get
,getAll
,has
など)を提供しています。
- Observableオブジェクトとしてルートパラメータを提供する
Router.navigate メソッドでクエリパラメータを使う場合
Router.navigate
メソッドでクエリパラメータを使う場合のプログラム例を以下に示しています。
app-routing.module.ts
import { NgModule } from '@angular/core';
// RoutesとRouterModuleをインポート
import { Routes, RouterModule } from '@angular/router';
// 遷移先のコンポーネントをインポート
import { MainComponent } from './main.component';
// ルーティングテーブルでパスとコンポーネントの対応付けをする
const routes: Routes = [
{ path: 'main', component: MainComponent }, // クエリパラメータを使う場合
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
Router.navigate
メソッドを使ってクエリパラメータを渡す場合、ルーティング定義においてpath: 'main/:id'
のようなルートパラメータを明示的に指定する必要はありません。クエリパラメータを使用する際は、シンプルなpath: 'main'
だけで十分です。
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">メインページ</button>
<router-outlet></router-outlet>
`,
})
export class AppComponent {
constructor(private router: Router) {}
onClick() {
// クエリパラメータを使う場合
this.router.navigate(['/main'], {
queryParams: { category: 'Angular', keyword: 'Routing' },
});
}
}
クエリパラメータを渡す際には、以下に示すようにqueryParamsを使用します。
this.router.navigate(['/main'], {
queryParams: { category: 'Angular', keyword: 'Routing' },
});
これにより、Router.navigate
メソッドが実行されると、URLは以下のようになります。なお、「http://localhost:4200」の箇所は環境によって変わります(ローカル開発サーバーを使用しており、ポート4200で実行している場合には以下のURLになります)。
http://localhost:4200/main?category=Angular&keyword=Routing
main.component.ts
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
template: `
<!--クエリパラメータを使う場合 -->
<h1>カテゴリー: {{ recieveCategory }}</h1>
<h1>キーワード: {{ recieveKeyword }}</h1>
`,
})
export class MainComponent {
// クエリパラメータを使う場合
recieveCategory: string | null = null;
recieveKeyword: string | null = null;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.queryParams.subscribe((params) => {
this.recieveCategory = params['category'];
this.recieveKeyword = params['keyword'];
});
}
}
クエリパラメータを取得する際には、queryParamsプロパティまたはqueryParamMapプロパティを使用します。上記のプログラムではqueryParams
プロパティを使用して、クエリパラメータを取得しています。
queryParamMap
プロパティを用いる場合には、以下に示すように記述します。queryParamMap
プロパティを購読し、get
メソッドを使用してクエリパラメータの値を取得します。
ngOnInit() {
this.route.queryParamMap.subscribe((paramsMap) => {
this.recieveCategory = paramsMap.get('category');
this.recieveKeyword = paramsMap.get('keyword');
});
}
ActivatedRoute
クラスのqueryParamMap
プロパティを使用する場合、取得したパラメータはstring
またはnull
の両方の型を持つ可能性があるため、recieveCategory
とrecieveKeyword
の型をstring | null
に変更しています。
ActivatedRoute の snapshot プロパティを使ってクエリパラメータを受け取る場合
ActivatedRoute
クラスのqueryParams
プロパティやqueryParamsMap
プロパティを購読する代わりに、以下に示すようにActivatedRoute
クラスの snapshot
プロパティを使っても直接クエリパラメータを取得することができます。
これは、コンポーネントが初期化されるときに一度だけクエリパラメータを取得する場合に便利です。これを使用すると、クエリパラメータが変更されても再購読することはありません。クエリパラメータがコンポーネントのライフサイクル中で変更されることがない場合に特に役立ちます。
ngOnInit() {
// queryParamsを使用してクエリパラメータを取得
this.recieveCategory = this.route.snapshot.queryParams['category'];
this.recieveKeyword = this.route.snapshot.queryParams['keyword'];
// queryParamsMapを使用してクエリパラメータを取得
this.recieveCategory = this.route.snapshot.queryParamMap.get('category');
this.recieveKeyword = this.route.snapshot.queryParamMap.get('keyword');
}
queryParamsとqueryParamMapの違い
queryParams
プロパティおよびqueryParamMap
プロパティはどちらもActivatedRoute
クラスのプロパティです。queryParams
プロパティおよびqueryParamMap
プロパティの違いを以下に示します。
queryParams
プロパティ- Observableオブジェクトとしてクエリパラメータを提供する
ActivatedRoute
クラスのプロパティです。 - 購読することで現在のクエリパラメータの値を取得することができます。
- 取得されるクエリパラメータは、
{ key: string}
の形式になります。
- Observableオブジェクトとしてクエリパラメータを提供する
queryParamsMap
プロパティ- Observableオブジェクトとしてクエリパラメータを提供する
ActivatedRoute
クラスのプロパティです。 - 購読することで現在のクエリパラメータの値を取得することができます。
- 取得されるクエリパラメータは、
ParamMap
オブジェクトとして提供されます。ParamMap
オブジェクトは、クエリパラメータをより効果的に操作するためのメソッド(例:get
,getAll
,has
など)を提供します。
- Observableオブジェクトとしてクエリパラメータを提供する
Router.navigate メソッドでURLフラグメントを使う場合
Router.navigate
メソッドでURLフラグメント(アンカー、フラグメント識別子)を使う場合のプログラム例を以下に示しています。
app-routing.module.ts
import { NgModule } from '@angular/core';
// RoutesとRouterModuleをインポート
import { Routes, RouterModule } from '@angular/router';
// 遷移先のコンポーネントをインポート
import { MainComponent } from './main.component';
// ルーティングテーブルでパスとコンポーネントの対応付けをする
const routes: Routes = [
{ path: 'main', component: MainComponent }, // URLフラグメントを使う場合
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
Router.navigate
メソッドを使ってURLフラグメントを渡す場合、ルーティング定義においてpath: 'main/:id'
のようなルートパラメータを明示的に指定する必要はありません。URLフラグメントを使用する際は、シンプルなpath: 'main'
だけで十分です。
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">メインページ</button>
<router-outlet></router-outlet>
`,
})
export class AppComponent {
constructor(private router: Router) {}
onClick() {
// URLフラグメントを使う場合
this.router.navigate(['/main'], { fragment: 'Angular' });
}
}
URLフラグメントを渡す際には、以下に示すようにfragmentを使用します。
this.router.navigate(['/main'], { fragment: 'Angular' });
これにより、Router.navigate
メソッドが実行されると、URLは以下のようになります。なお、「http://localhost:4200」の箇所は環境によって変わります(ローカル開発サーバーを使用しており、ポート4200で実行している場合には以下のURLになります)。
http://localhost:4200/main#Angular
main.component.ts
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
template: `
<!--URLフラグメントを使う場合 -->
<h1>フラグメント: {{ recieveFragment }}</h1>
`,
})
export class MainComponent {
// URLフラグメントを使う場合
recieveFragment: string | null = null;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.fragment.subscribe((frag) => {
this.recieveFragment = frag;
});
}
}
URLフラグメントを取得する際には、fragmentプロパティを使用します。
ActivatedRoute
クラスのfragment
プロパティを使用する場合、取得したパラメータは string
またはnull
の両方の型を持つ可能性があるため、recieveFragment
の型をstring | null
に変更しています。
ActivatedRoute のsnapshotプロパティを使ってURLフラグメントを受け取る場合
ActivatedRoute
クラスのfragment
プロパティを購読する代わりに、以下に示すようにActivatedRoute
のsnapshot
プロパティを使っても直接URLフラグメントを取得することができます。
これは、コンポーネントが初期化されるときに一度だけURLフラグメントを取得する場合に便利です。これを使用すると、URLフラグメントが変更されても再購読することはありません。URLフラグメントがコンポーネントのライフサイクル中で変更されることがない場合に特に役立ちます。
ngOnInit() {
this.recieveFragment = this.route.snapshot.fragment;
}
Router.navigate メソッドでマトリクスURLパラメータを使う場合
Router.navigate
メソッドでマトリクスURLパラメータを使う場合のプログラム例を以下に示しています。
app-routing.module.ts
import { NgModule } from '@angular/core';
// RoutesとRouterModuleをインポート
import { Routes, RouterModule } from '@angular/router';
// 遷移先のコンポーネントをインポート
import { MainComponent } from './main.component';
// ルーティングテーブルでパスとコンポーネントの対応付けをする
const routes: Routes = [
{ path: 'main', component: MainComponent }, // マトリクスURLを使う場合
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
Router.navigate
メソッドを使ってマトリクスURLパラメータを渡す場合、ルーティング定義においてpath: 'main/:id'
のようなルートパラメータを明示的に指定する必要はありません。マトリクスURLパラメータを使用する際は、シンプルなpath: 'main'
だけで十分です。
app.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
template: `
<button (click)="onClick()">メインページ</button>
<router-outlet></router-outlet>
`,
})
export class AppComponent {
constructor(private router: Router) {}
onClick() {
// マトリクスURLを使う場合
this.router.navigate([
'/main',
{ category: 'Angular', keyword: 'Routing' },
]);
}
}
マトリクスURLパラメータを渡す際には、以下に示すように配列を使用します。
this.router.navigate([
'/main',
{ category: 'Angular', keyword: 'Routing' },
]);
これにより、Router.navigate
メソッドが実行されると、URLは以下のようになります。なお、「http://localhost:4200」の箇所は環境によって変わります(ローカル開発サーバーを使用しており、ポート4200で実行している場合には以下のURLになります)。
http://localhost:4200/main;category=Angular;keyword=Routing
main.component.ts
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
template: `
<!--マトリクスURLを使う場合 -->
<h1>カテゴリー: {{ recieveCategory }}</h1>
<h1>キーワード: {{ recieveKeyword }}</h1>
`,
})
export class MainComponent {
// マトリクスURLを使う場合
recieveCategory: string | null = null;
recieveKeyword: string | null = null;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.params.subscribe((params) => {
this.recieveCategory = params['category'];
this.recieveKeyword = params['keyword'];
});
}
}
マトリクスURLパラメータを取得する際には、paramsプロパティまたはparamMapプロパティを使用します。上記のプログラムではparams
プロパティを使用して、マトリクスURLパラメータを取得しています。
paramMap
プロパティを用いる場合には、以下に示すように記述します。paramMap
プロパティを購読し、get
メソッドを使用してマトリクスURLパラメータの値を取得します。
ngOnInit() {
this.route.paramMap.subscribe((paramMap) => {
this.recieveCategory = paramMap.get('category');
this.recieveKeyword = paramMap.get('keyword');
});
}
ActivatedRoute
クラスの params
プロパティまたはparamMap
プロパティを使用する場合、取得したパラメータはstring
またはnull
両方の型を持つ可能性があるため、recieveCategory
とrecieveKeyword
の型をstring | null
に変更しています。
ActivatedRouteのsnapshotプロパティを使ってマトリクスURLのパラメータを受け取る場合
ActivatedRoute
クラスのparams
プロパティやparamsMap
プロパティを購読する代わりに、以下に示すようにActivatedRoute
クラスのsnapshot
プロパティを使っても直接マトリクスURLのパラメータを取得することができます。
これは、コンポーネントが初期化されるときに一度だけマトリクスURLのパラメータを取得する場合に便利です。これを使用すると、マトリクスURLのパラメータが変更されても再購読することはありません。マトリクスURLのパラメータがコンポーネントのライフサイクル中で変更されることがない場合に特に役立ちます。
ngOnInit() {
// paramsを使用してマトリクスURLパラメータを取得
this.recieveCategory = this.route.snapshot.params['category'];
this.recieveKeyword = this.route.snapshot.params['keyword'];
// paramsMapを使用してマトリクスURLパラメータを取得
this.recieveCategory = this.route.snapshot.paramMap.get('category');
this.recieveKeyword = this.route.snapshot.paramMap.get('keyword');
}
本記事のまとめ
この記事ではRouter.navigate
メソッドを用いて以下のパラメータを渡す方法を説明しました。
- ルートパラメータ
- クエリパラメータ
- URLフラグメント
- マトリクスURLパラメータ
お読み頂きありがとうございました。