Maison > Article > interface Web > Des bases à l'avancée : maîtriser les signaux angulaires étape par étape
Les signaux angulaires représentent une approche révolutionnaire de la gestion de l'état et de la réactivité dans les applications angulaires. Ce guide complet vous guidera à travers tout ce que vous devez savoir sur les signaux, des concepts de base aux implémentations avancées.
Les signaux sont une nouvelle primitive introduite dans Angular 16 qui fournit un moyen de gérer la gestion de l'état réactif. Ce sont des enveloppes spéciales autour des valeurs qui informent les consommateurs intéressés lorsque ces valeurs changent.
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; });
Les signaux calculés tirent automatiquement leur valeur d'autres signaux :
import { signal, computed } from '@angular/core'; const price = signal(100); const quantity = signal(2); const total = computed(() => price() * quantity()); console.log(total()); // Output: 200
Les effets vous permettent d'effectuer des effets secondaires lorsque les signaux changent :
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: '' });
Optimisation des performances
Gestion des erreurs
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');
Q : Quelle est la différence entre les signaux et le comportement sujet ?
R : Les signaux sont plus simples, plus performants et intégrés directement dans la détection des changements d'Angular. Les BehaviorSubjects sont des observables RxJS qui nécessitent une gestion manuelle des abonnements.
Q : Puis-je utiliser des signaux avec NgRx ?
R : Oui, les signaux peuvent compléter NgRx pour l'état des composants locaux tandis que NgRx gère l'état global de l'application.
Q : Les signaux remplacent-ils la liaison de propriété traditionnelle ?
R : Non, les signaux sont un outil supplémentaire. Utilisez-les lorsque vous avez besoin d'une gestion d'état réactive, mais la liaison de propriété traditionnelle est toujours valable pour les cas plus simples.
Q : Les signaux sont-ils disponibles dans les anciennes versions d'Angular ?
R : Les signaux ont été introduits dans Angular 16. Pour les anciennes versions, vous devrez utiliser des alternatives telles que les observables RxJS.
Les signaux angulaires offrent un moyen puissant et efficace de gérer la gestion de l'état réactif dans vos applications. En suivant les exemples et les bonnes pratiques décrits dans ce guide, vous serez bien équipé pour mettre en œuvre Signals dans vos propres projets. N'oubliez pas de commencer simplement et d'incorporer progressivement des modèles plus avancés à mesure que vos besoins augmentent.
La clé pour maîtriser les signaux est la pratique et la compréhension de leur nature réactive. Commencez par mettre en œuvre des exemples de base, puis progressez vers des scénarios plus complexes à mesure que vous vous familiarisez avec les concepts.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!