みなさんこんにちは、現役エンジニアのサメハックです
アパレル企業でトップ販売員を経て
未経験からWebエンジニアに転職し、
現在正社員として5年働いています!
Angularの解説シリーズです。
今回はルーターリンクにパラメータを渡す方法について学んでいきましょう!
駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!
この記事を読むと・・・
- ルータリンクにパラメータを渡せる
※PCにnpm、nodeがインストールされている前提で記述します。
yarn等をお使いの方は読み替えてください。
環境がない人はcodesansboxを使ってね!
作りたいもの
- トップ画面でユーザ選択し、ユーザ情報表示画面ユーザIDを渡す
- ユーザ情報詳細画面でユーザIDを受け取り、データを取得する
という流れのアプリケーションを作ります。
これが今回の完成形だよ!
他のファイルは左上のハンバーガーメニューをクリックして確認してね!
他のファイルは左上のハンバーガーメニューをクリックして確認してね!
実際に作ってみよう!!
ルーティング設定をしよう!
ng generate module my-routing --flat --module=app
パラメータを渡すには
■パラメータを渡す構文
const routes: Routes = [
{ path: 'パス/:パラメータ名', component: コンポーネント名 },
];
ルーターリンクにパラメータを渡すには、
ルーティング設定にパラメータを記述しておく必要があります。
パラメータ名は、受け取るコンポーネントと統一する必要があるよ!
my-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { UserListComponent } from './user-list/user-list.component';
import { UserDetailComponent } from './user-detail/user-detail.component';
// ルーティング設定
const routes: Routes = [
{ path: 'top', component: UserListComponent },
// パラメータを{ user-id:値 }という形式で渡す
// 【重要】パラメータ名はuser-detail.component.tsと合わせる
{ path: 'user-detail/:user-id', component: UserDetailComponent },
// 不正なURLの場合、topへリダイレクト
{ path: '**', redirectTo: '/top', pathMatch: 'full' },
];
@NgModule({
// ルーティングを有効にする
// 以下の2つの設定がないと、が受け取れない
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class MyRoutingModule {}
ルーティングの基本について復習したい方はこちら!
【Angular】ルーティングを設定しよう!【RouterModule】
app.component.html
<h1>ルーターリンクにパラメータを渡す</h1>
<router-outlet></router-outlet>
これでルーティング設定を受け取るれるよ!
ユーザ一覧画面をつくろう
ng generate component user-list
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-user-list',
templateUrl: './user-list.component.html',
styleUrls: ['./user-list.component.css'],
})
export class UserListComponent implements OnInit {
// HttpClientをインスタンス化(DI)
constructor(private http: HttpClient) {}
userList: any;
GET_USERS_API = 'https://jsonplaceholder.typicode.com/users';
ngOnInit(): void {
// 画面表示時にAPIを叩く
this.getUserList();
}
/**
* ユーザリスト取得関数
*/
getUserList(): void {
// HTTP通信
this.http.get(this.GET_USERS_API).subscribe(
// 通信成功 200~299の処理
(response) => {
console.log(response);
// ユーザリストにレスポンスを代入
this.userList = response;
},
// 通信失敗時の処理
(error) => {
console.error(error);
}
);
}
}
HTTP通信について復習したい方はこちら!
【Angular】HTTP通信をしよう!【HttpClient】
ルーターリンクにパラメータを設定
ルーターリンクにパラメータを渡すには、このような記述になります。
<a routerLink="/パス/渡したい値">
user-link.html
<h2>ユーザ一覧</h2>
<div class="" *ngFor="let user of userList">
<!-- ユーザIDをuser-detail.component.tsに渡してページ切り替え-->
<a routerLink="/user-detail/{{ user.id }}">
{{ user.id }}:{{ user.name }}
</a>
</div>
パラメータを受け取ろう
パラメータを受け取るにはActivatedRouteを使用します。
■構文
constructor(
// URLパラメータを取得するサービス
private route: ActivatedRoute,
) {}
this.route.snapshot.paramMap.get(パラメータ名);
ここのパラメータ名はmy-routing.moudle.tsで設定したものだよ!
コンポーネント作成
ge generate component user-detail
user.detail.component.ts
import { Component, Input, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
@Component({
selector: 'app-user-detail',
templateUrl: './user-detail.component.html',
styleUrls: ['./user-detail.component.css'],
})
export class UserDetailComponent implements OnInit {
user: any;
GET_USERS_API = 'https://jsonplaceholder.typicode.com/users';
constructor(
private http: HttpClient,
// URLパラメータを取得するサービス
private route: ActivatedRoute,
// ブラウザの戻る・進むをAngular経由で行う
private location: Location
) {}
ngOnInit(): void {
// 取得パラメータを確認
console.log(this.route.snapshot.paramMap);
// ユーザ情報取得
this.getUser(this.userId);
}
// user-idパラメータを取得する
// 【重要】パラメータ名はmy-routing.module.tsと合わせる
userId = this.route.snapshot.paramMap.get('user-id');
/**
* ユーザ取得関数
* パラメータにユーザIDを指定してユーザ指定
* @param userId ユーザID
*/
getUser(userId: string): void {
// HTTP通信
this.http
.get(
this.GET_USERS_API,
// パラメータを指定。idが777の場合、以下と同様
// GET_USERS_API = 'https://jsonplaceholder.typicode.com/users?userId=1';
{ params: { id: userId } }
)
.subscribe(
// 通信成功 200~299の処理
(response) => {
console.log(response);
// selectedUserにレスポンスを代入
// ※配列形式のため、0番目を指定
this.user = response[0];
},
// 通信失敗時の処理
(error) => {
console.error(error);
}
);
}
goBack() {
// 前のページに戻る
this.location.back();
}
}
ちなみに、パラメータはこのような形式で取得されます。
user.detail.component.html
<!-- ユーザ情報取得後似表示 -->
<div *ngIf="user">
<h2>ユーザ情報</h2>
Name:{{ user.name }}
<br />
ID:{{ user.id }}
<br />
E-mail:{{ user.email }}
<br />
TEL:{{ user.phone }}
</div>
<button (click)="goBack()">戻る</button>
このようにユーザ7を選択すると
user-detail/7
というルーティングが適用され、受け取った7をユーザIDとして検索し
データを取得することができました。
まとめ
- パラメータ名付きのルーティング設定をしておくことで、ルータリンクをにパラメータを渡すことが可能
- パラメータを受け取るにはActivetedRouteを使う
満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈