0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Angularと戯れる④

Posted at

はじめに

Angularチュートリアル:Tour of Heroesを読み進めていきます。

開発環境

  • OS: Windows10
  • Nodeバージョン: 18.18.0
  • Angular CLI バージョン: 17.3.8
  • エディタ: VSCode

3. フィーチャーコンポーネントの作成

3. フィーチャーコンポーネントの作成を読んでいきます。

関連コマンド

コンポーネント作成

ng generate component %コンポーネント名%
今回は以下のコマンドを実行。
ng generate component hero-detail

これを実行することで、src/app/app.module.component.tsにhero-detailについての記載が追加されます。

src/app/app.module.ts
import { HeroDetailComponent } from './hero-detail/hero-detail.component';

...
@NgModule({
  declarations: [
    ...,
    HeroDetailComponent
  ],
  ...
})
export class AppModule { }

ソースコードを読み解いてみる

アプリの構成

tour-of-heroes_3_create-feature-component.png

今までheroesコンポーネント内で行っていた「Heroの詳細を表示する」という責務をhero-detailコンポーネントに委託します。

最終的に、こんな感じの構成になります。
キャプチャ.JPG

子コンポーネントへのデータの送信

@Inputデコレーター

親コンポーネントから子コンポーネントへの値の受け渡しの際に使われるデコレーター。

このチュートリアルの場合、「heroesコンポーネントが持っている値をhero-detailコンポーネントに渡す」ことを行います。

受け渡し元(今回の場合heroesコンポーネント)を親コンポーネント、受け渡し先(今回の場合hero-detailコンポーネント)を子コンポーネントと考えます。

  • 子コンポーネント側の準備: 親から渡ってくる値を受ける窓口を作る
src/app/hero-detail/hero-detail.component.ts
import { Component, Input } from '@angular/core';
import { Hero } from '../hero';

@Component({
  selector: 'app-hero-detail',
  templateUrl: './hero-detail.component.html',
  styleUrls: ['./hero-detail.component.css']
})
export class HeroDetailComponent {
  /*
   * ・親コンポーネントから渡ってくる値をhero(Hero型)という窓口で受ける。
   * ・@Inputデコレーターを使うことで、親コンポーネントからの入力を受け付けることができる。
   */
  @Input() hero?: Hero;
}

[参考]

プロパティバインディング

コンポーネントがもつ値(プロパティ)を、ターゲットのタグの特定の値に代入する手法。
[%受け渡し先のプロパティ名%]="%受け渡し元のプロパティ名%"

このチュートリアルでは、heroesコンポーネントが持つselectedHeroというプロパティを、hero-detailコンポーネントのheroというプロパティに渡します。

  • 値を渡す側:heroesコンポーネント
src/app/heroes/heroes.component.html
<app-hero-detail [hero]="selectedHero"></app-hero-detail>

selectedFolderの値を、受け渡し先のhero-detailコンポーネントに渡します。heroという名前の窓口を先方が用意してくれているので、受け渡し先としてそこを指定します。

なお、app-hero-detailという名前は、hero-detailコンポーネントのtsのselectorに記載されている値と同じです。

src/app/hero-detail/hero-detail.component.ts
@Component({
  selector: 'app-hero-detail',
  templateUrl: './hero-detail.component.html',
  styleUrls: ['./hero-detail.component.css']
})
...

  • 値を受け取る側:hero-detailコンポーネント
src/app/hero-detail/hero-detail.component.html
<div *ngIf="hero">
    <h2>{{ hero.name }}</h2>
    <div>id: {{ hero.id }}</div>
    <div>
        <label for="hero-name">Hero name: </label>
        <input id="hero-name" [(ngModel)]="hero.name" placeholder="name">
    </div>
</div>

受け渡し元であるheroesコンポーネントのselectedHeroプロパティを、受け渡し先であるhero-detailでは "hero" という窓口で受けます。

[参考]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?