🅰️
Angular - Control Flowと構造ディレクティブを使用した書き方との比較
Angularのv17にてControl Flow
が新たに追加されたということで、@if
、@for
、@switch
を使用した書き方を*ngIf
などの構造ディレクティブを使用した書き方と比較とした形でまとめてみました。
@if
**ngIf
を使用した場合
<p *ngIf="isLoggedIn else notLoggedIn">ログインしています。</p>
<ng-template #notLoggedIn>
<p>ログインしていません。</p>
</ng-template>
@if
を使用した場合
@if (isLoggedIn) {
<p>ログインしています。</p>
} @else {
<p>ログインしていないです。</p>
}
@if
を使用する場合は、@else if
と書くこともできます。
@if (x > y) {
<p>xはyの値はより大きいです</p>
} @else if (x < y) {
<p>xはyの値はより小さいです</p>
} @else {
<p>xとyの値は等しいです</p>
}
@for
*ngFor
を使用した場合
<ul>
<li *ngFor="let user of users">
{{user.name}}
</li>
</ul>
@for
を使用した場合
@for
を使用する場合、@empty
も使用することができます。またtrack
の設定が必須となります。
<ul>
@for (user of users; track user.id) {
<li>{{user.name}}</li>
}
@empty {
<li>ユーザーが存在しません。</li>
}
</ul>
また、$count
や$index
などの変数を使用することで、アイテム数やインデックスなどを取得しループ内で使用することもできます。
その他のものに関しては、ドキュメントを参照してください。
<ul>
@for (user of users; track user.id; let cnt = $count, idx = $index) {
<li>{{idx + 1}}/{{cnt}}: {{user.name}}</li>
}
@empty {
<li>ユーザーが存在しません。</li>
}
</ul>
@switch
*ngSwitch
を使用した場合
<ng-container [ngSwitch]="value">
<p *ngSwitchCase="'a'">値はaです。</p>
<p *ngSwitchCase="'b'">値はbです。</p>
<p *ngSwitchCase="'c'">値はcです。</p>
<p *ngSwitchDefault>値はa、b、c以外です。</p>
</ng-container>
@switch
を使用した場合
@switch (value) {
@case ('a') {
<p>値はaです。</p>
}
@case ('b') {
<p>値はbです。</p>
}
@case ('c') {
<p>値はcです。</p>
}
@default {
<p>値はa、b、c以外です。</p>
}
}
まとめ
従来のディレクティブを使用する方法と比べ、HTMLタグの中に条件などを記載することなく書けること、また複数の要素をまとめる必要がある場合にng-container
を使用する必要がなくなることを考えると、コード可読性が上がってくれるのではないかと期待しています。
Discussion