# 入力(Inputs) 入力により、親コンポーネントから子コンポーネントにデータを流すことができます。Angular はモダンなアプリケーションにはシグナルベースの `input` API の使用を推奨しています。 ## シグナルベースの入力 `input()` 関数を使用して入力を宣言します。これは `InputSignal` を返します。 ```ts import {Component, input, computed} from '@angular/core'; @Component({ selector: 'app-user', template: `

User: {{ name() }} ({{ age() }})

`, }) export class User { // デフォルト値を持つオプションの入力 name = input('Guest'); // 必須の入力 age = input.required(); // 入力はリアクティブなシグナル label = computed(() => `Name: ${this.name()}`); } ``` ### テンプレートでの使用 ```html ``` ## 設定オプション `input` 関数は設定オブジェクトを受け取ります: - **エイリアス**:テンプレートで使用されるプロパティ名を変更します。 - **トランスフォーム**:コンポーネントに到達する前に値を変更します。 ```ts import { input, booleanAttribute } from '@angular/core'; @Component({...}) export class CustomButton { // エイリアスの例 label = input('', { alias: 'btnLabel' }); // 組み込みヘルパーを使用したトランスフォームの例 disabled = input(false, { transform: booleanAttribute }); } ``` ## モデル入力(双方向バインディング) 双方向データバインディングをサポートする入力を作成するには `model()` を使用します。 ```ts @Component({ selector: 'custom-counter', template: ``, }) export class CustomCounter { value = model(0); increment() { this.value.update((v) => v + 1); } } ``` ### 使用方法 ```html ``` ## デコレーターベースの入力(@Input) レガシー API は引き続きサポートされていますが、新しいコードには推奨されません。 ```ts import { Component, Input } from '@angular/core'; @Component({...}) export class Legacy { @Input({ required: true }) value = 0; @Input({ transform: trimString }) label = ''; } ``` ## ベストプラクティス - **シグナルを優先する**:より良いリアクティビティと型安全性のために `@Input()` ではなく `input()` を使用します。 - **必須入力**:ビルド時エラーを得るために必須データには `input.required()` を使用します。 - **純粋なトランスフォーム**:入力トランスフォーム関数は純粋で静的に解析可能であることを確認します。 - **衝突を避ける**:標準の DOM プロパティと衝突する入力名は使用しないでください(例:`id`、`title`)。