Angular Signals stellen einen revolutionären Ansatz zur Zustandsverwaltung und Reaktivität in Angular-Anwendungen dar. Dieser umfassende Leitfaden führt Sie durch alles, was Sie über Signale wissen müssen, von grundlegenden Konzepten bis hin zu erweiterten Implementierungen.
Signale sind ein neues Grundelement, das in Angular 16 eingeführt wurde und eine Möglichkeit zur Verwaltung reaktiver Zustände bietet. Dabei handelt es sich um spezielle Wrapper für Werte, die interessierte Verbraucher benachrichtigen, wenn sich diese Werte ändern.
import { signal } from '@angular/core'; // Creating a simple signal const count = signal(0); // Reading signal value console.log(count()); // Output: 0 // Updating signal value count.set(1);
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-counter', template: ` <div> <p>Count: {{ count() }}</p> <button (click)="increment()">Increment</button> </div> ` }) export class CounterComponent { count = signal(0); increment() { this.count.set(this.count() + 1); } }
const name = signal('John'); name.set('Jane');
const counter = signal(0); counter.update(value => value + 1);
const user = signal({ name: 'John', age: 25 }); user.mutate(value => { value.age = 26; });
Berechnete Signale leiten ihren Wert automatisch von anderen Signalen ab:
import { signal, computed } from '@angular/core'; const price = signal(100); const quantity = signal(2); const total = computed(() => price() * quantity()); console.log(total()); // Output: 200
Effekte ermöglichen es Ihnen, Nebenwirkungen durchzuführen, wenn sich Signale ändern:
import { signal, effect } from '@angular/core'; const message = signal('Hello'); effect(() => { console.log(`Message changed to: ${message()}`); }); message.set('Hi'); // Logs: "Message changed to: Hi"
interface Product { id: number; name: string; price: number; } @Component({ selector: 'app-shopping-cart', template: ` <div> <h2>Shopping Cart</h2> <div *ngFor="let item of cartItems()"> {{ item.name }} - ${{ item.price }} </div> <p>Total: ${{ cartTotal() }}</p> </div> ` }) export class ShoppingCartComponent { cartItems = signal<Product[]>([]); cartTotal = computed(() => this.cartItems().reduce((total, item) => total + item.price, 0) ); addToCart(product: Product) { this.cartItems.update(items => [...items, product]); } removeFromCart(productId: number) { this.cartItems.update(items => items.filter(item => item.id !== productId) ); } }
@Component({ selector: 'app-user-form', template: ` <form (submit)="handleSubmit($event)"> <input [value]="formData().name" (input)="updateName($event)" placeholder="Name" > <input [value]="formData().email" (input)="updateEmail($event)" placeholder="Email" > <button type="submit">Submit</button> </form> ` }) export class UserFormComponent { formData = signal({ name: '', email: '' }); updateName(event: Event) { const input = event.target as HTMLInputElement; this.formData.update(data => ({ ...data, name: input.value })); } updateEmail(event: Event) { const input = event.target as HTMLInputElement; this.formData.update(data => ({ ...data, email: input.value })); } handleSubmit(event: Event) { event.preventDefault(); console.log('Form submitted:', this.formData()); } }
// Good practice const userProfile = signal<UserProfile | null>(null); // Better practice with type safety interface UserProfile { name: string; email: string; } const userProfile = signal<UserProfile>({ name: '', email: '' });
Leistungsoptimierung
Fehlerbehandlung
import { signal } from '@angular/core'; // Creating a simple signal const count = signal(0); // Reading signal value console.log(count()); // Output: 0 // Updating signal value count.set(1);
import { Component, signal } from '@angular/core'; @Component({ selector: 'app-counter', template: ` <div> <p>Count: {{ count() }}</p> <button (click)="increment()">Increment</button> </div> ` }) export class CounterComponent { count = signal(0); increment() { this.count.set(this.count() + 1); } }
const name = signal('John'); name.set('Jane');
F: Was ist der Unterschied zwischen Signals und BehaviorSubject?
A: Signale sind einfacher, leistungsfähiger und direkt in die Änderungserkennung von Angular integriert. BehaviorSubjects sind RxJS-Observables, die eine manuelle Abonnementverwaltung erfordern.
F: Kann ich Signale mit NgRx verwenden?
A: Ja, Signale können NgRx für den lokalen Komponentenstatus ergänzen, während NgRx den globalen Anwendungsstatus verwaltet.
F: Ersetzen Signale die traditionelle Eigenschaftsbindung?
A: Nein, Signale sind ein zusätzliches Werkzeug. Verwenden Sie sie, wenn Sie eine reaktive Zustandsverwaltung benötigen, die traditionelle Eigenschaftsbindung jedoch für einfachere Fälle weiterhin gültig ist.
F: Sind Signale in älteren Angular-Versionen verfügbar?
A: Signale wurden in Angular 16 eingeführt. Für ältere Versionen müssen Sie Alternativen wie RxJS-Observables verwenden.
Angular Signals bieten eine leistungsstarke und effiziente Möglichkeit, das reaktive Zustandsmanagement in Ihren Anwendungen zu verwalten. Wenn Sie die in diesem Leitfaden beschriebenen Beispiele und Best Practices befolgen, sind Sie bestens für die Implementierung von Signals in Ihren eigenen Projekten gerüstet. Denken Sie daran, einfach zu beginnen und nach und nach komplexere Muster zu integrieren, wenn Ihre Bedürfnisse wachsen.
Der Schlüssel zur Beherrschung von Signalen liegt in der Übung und im Verständnis ihrer reaktiven Natur. Beginnen Sie mit der Implementierung grundlegender Beispiele und gehen Sie dann zu komplexeren Szenarien über, wenn Sie mit den Konzepten vertraut sind.
Das obige ist der detaillierte Inhalt vonVon den Grundlagen bis zum Fortgeschrittenen: Winkelsignale Schritt für Schritt beherrschen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!