Rumah > Artikel > hujung hadapan web > Daripada Asas kepada Lanjutan: Menguasai Isyarat Sudut Langkah demi Langkah
Isyarat Sudut mewakili pendekatan revolusioner kepada pengurusan keadaan dan kereaktifan dalam aplikasi Sudut. Panduan komprehensif ini akan membimbing anda melalui semua yang anda perlu ketahui tentang Isyarat, daripada konsep asas kepada pelaksanaan lanjutan.
Isyarat ialah primitif baharu yang diperkenalkan dalam Angular 16 yang menyediakan cara untuk mengendalikan pengurusan keadaan reaktif. Ia adalah pembalut khas pada nilai yang memberitahu pengguna yang berminat apabila nilai tersebut berubah.
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; });
Isyarat yang dikira memperoleh nilainya daripada isyarat lain secara automatik:
import { signal, computed } from '@angular/core'; const price = signal(100); const quantity = signal(2); const total = computed(() => price() * quantity()); console.log(total()); // Output: 200
Kesan membolehkan anda melakukan kesan sampingan apabila isyarat berubah:
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: '' });
Pengoptimuman Prestasi
Pengendalian Ralat
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');
S: Apakah perbezaan antara Signals dan BehaviorSubject?
J: Isyarat lebih ringkas, lebih berprestasi dan disepadukan terus ke dalam pengesanan perubahan Angular. BehaviorSubjects ialah RxJS yang boleh diperhatikan yang memerlukan pengurusan langganan manual.
S: Bolehkah saya menggunakan Isyarat dengan NgRx?
J: Ya, Isyarat boleh melengkapkan NgRx untuk keadaan komponen tempatan manakala NgRx mengendalikan keadaan aplikasi global.
S: Adakah Isyarat menggantikan pengikatan harta tradisional?
J: Tidak, Isyarat ialah alat tambahan. Gunakannya apabila anda memerlukan pengurusan keadaan reaktif, tetapi pengikatan harta tradisional masih sah untuk kes yang lebih mudah.
S: Adakah Isyarat tersedia dalam versi Angular yang lebih lama?
J: Isyarat telah diperkenalkan dalam Angular 16. Untuk versi yang lebih lama, anda perlu menggunakan alternatif seperti RxJS observables.
Isyarat Sudut menyediakan cara yang berkuasa dan cekap untuk mengendalikan pengurusan keadaan reaktif dalam aplikasi anda. Dengan mengikuti contoh dan amalan terbaik yang digariskan dalam panduan ini, anda akan dilengkapi dengan baik untuk melaksanakan Isyarat dalam projek anda sendiri. Ingatlah untuk mulakan dengan mudah dan secara beransur-ansur menggabungkan corak yang lebih maju apabila keperluan anda berkembang.
Kunci untuk menguasai Isyarat ialah berlatih dan memahami sifat reaktifnya. Mulakan dengan melaksanakan contoh asas, kemudian maju ke senario yang lebih kompleks apabila anda selesa dengan konsep.
Atas ialah kandungan terperinci Daripada Asas kepada Lanjutan: Menguasai Isyarat Sudut Langkah demi Langkah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!