PureパイプとImpureパイプ
パイプの変更検知の動作を理解します。
「PureパイプとImpureパイプ」はCoddyKit上の無料Angular Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAngular Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Angular Academyコースには全4レッスンが含まれています。
デフォルトでは Pure パイプ
すべてのパイプはデフォルトで pure です。pure パイプは、入力値または引数が参照として変化した場合にのみ再実行されます。
Pure パイプが高速な理由
入力の参照が変わっていなければ、Angular は変更検知中に pure パイプの呼び出しをスキップします。そのため、pure パイプは効率的です。
@Pipe({ name: "exclaim", standalone: true })
export class ExclaimPipe implements PipeTransform {
transform(value: string) { return value + "!"; }
}
// pure: only re-runs when value changes参照の変更と値の変更
pure パイプは 参照 の変更を検知します。配列をその場で変更しても、配列の参照は同じままなので pure パイプは実行されません。
// this will NOT re-run a pure pipe:
this.items.push("new");
// this WILL, new reference:
this.items = [...this.items, "new"];Impure パイプの宣言
@Pipe デコレーターで pure: false を設定すると、パイプを impure にできます。impure パイプは変更検知のサイクルごとに実行されます。
@Pipe({ name: "filter", standalone: true, pure: false })
export class FilterPipe implements PipeTransform {
transform(items: string[], term: string) {
return items.filter(i => i.includes(term));
}
}Impure パイプを使う場面
その場で変更する配列のフィルタリングなど、可変データに依存する変換や、新しい参照を作らずに変化する値に依存する変換には impure パイプを使用します。
Impure パイプのコスト
impure パイプは変更検知のサイクルごとに、非常に頻繁に実行されます。内部に重いロジックを入れるとパフォーマンスが低下するため、軽量に保ってください。
async パイプは Impure
組み込みの async パイプは impure です。Observable または Promise を購読し、新しい値が届くたびにビューを更新します。
<p>{{ data$ | async }}</p>
// component
data$ = this.http.get("/api/data");async パイプによる自動購読解除
async パイプの大きな利点は、コンポーネントの破棄時に自動で購読を解除し、メモリリークを防げることです。
@Component({
template: "<p>{{ count$ | async }}</p>"
})
export class DemoComponent {
count$ = interval(1000);
}Pure パイプでのミューテーション回避
コレクションで pure パイプを機能させるには、データをイミュータブルとして扱います。既存の配列やオブジェクトを変更するのではなく、新しいものを作成してください。
// good for pure pipes:
this.users = this.users.concat(newUser);
this.user = { ...this.user, name: "Ada" };Pure と Impure の選択
予測しやすく高速な動作のため、pure パイプを優先してください。本当にミューテーションへの反応が必要な場合だけ impure パイプを使用します。多くの場合、イミュータブルなデータを使うよう設計し直せば、impure パイプは必要ありません。
Impure パイプのベストプラクティス
impure パイプを使う必要がある場合は、入力が変わっていないときに再計算しないよう、結果をメモ化してください。
@Pipe({ name: "memoFilter", standalone: true, pure: false })
export class MemoFilterPipe implements PipeTransform {
private last = "";
private cache: string[] = [];
transform(items: string[], term: string) {
if (term === this.last) return this.cache;
this.last = term;
this.cache = items.filter(i => i.includes(term));
return this.cache;
}
}理解度チェック
pure パイプと impure パイプについての理解度を確認しましょう。
まとめ
pure パイプは参照が変わった場合にのみ実行されるため高速です。一方、impure パイプ(pure: false)はすべてのサイクルで実行され、可変データに適しています。async パイプは impure で、購読を自動的に解除します。
pure パイプの効率を保つため、イミュータブルなデータを優先してください。
よくある質問
「PureパイプとImpureパイプ」レッスンは無料ですか?
はい。「PureパイプとImpureパイプ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Angular Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Angular Academyコースには全4レッスンが含まれています。
「PureパイプとImpureパイプ」で何を学びますか?
パイプの変更検知の動作を理解します。 ブラウザで直接実行するハンズオンコードでAngular Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Angular Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAngular Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「PureパイプとImpureパイプ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAngular Academyレッスンでコードを書いて実行できますか?
はい。すべてのAngular Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 組み込みパイプの使用
- パイプの連結とパラメーター化
- カスタムパイプの作成
- PureパイプとImpureパイプ