角度信号
想象一下,你和朋友在一家人很多的咖啡馆里。每当你点的咖啡准备好时,柜台上方的灯就会闪烁——这是信号!你不需要一直询问咖啡是否准备好了;灯光会立即告诉你。
它们就像信使一样,当数据发生变化时通知您的应用程序,以便一切都无缝更新,而无需您不断检查。
**信号**是一种反应式状态管理机制,它提供了一种直观的方式来管理和跟踪状态变化,同时通过消除手动订阅、区域绑定或复杂状态管理库的需要来提高性能。
*
**我们如何使用信号?**
1.创建一个具有初始值的信号。
// import signal to use
import { signal } from "@angular/core";
// define a signal with intial value
const _counter = signal(0);2.读取信号值。
_counter()
3.改变值。
_counter.set(1);
4.通过登录来更改值
_counter.update((value) => {
if(value == 0) return 0;
return value - 1;
});5.衍生信号根据其他信号计算值;这将根据当前信号创建一个新的信号。
const doubleCounter = computed(() => _counter() * 2);
6.创建可观察的信号。
const rxSignal = fromObservable(of(1, 2, 3));
7.根据信号创建可观察对象。
const obs$ = toObservable(rxSignal); obs$.subscribe(value => console.log(value));
// both are readonly _counter: Signal= signal(0); _doubleCount: Signal = computed(() => this._counter() * 2);
// both are writable _counter = signal(0); // default is writable _counter: WritableSignal= signal(0);
现在我们来看一个反例:
它有两个组件(一个用于查看,另一个用于增加/减少)和一个服务来管理我们的信号。
1.柜台服务管理我们的信号。
我们有三个功能:
import { signal } from "@angular/core";
export class CounterService {
private _counter = signal(0);
getCounter() {
return this._counter();
}
increment() {
this._counter.update((value) => value + 1);
}
decrement() {
this._counter.update((value) => {
if(value == 0) return 0;
return value - 1;
});
}
}2.使用计数器服务并增加/减少信号值的控制组件。
export class CounterControlsComponent {
constructor(public counterService: CounterService){}
}export class CounterViewComponent {
constructor(public counterService: CounterService){}
}Counter : {{counterService.getCounter()}}
您应该看到这样的视图,并且当您在值为 0 时单击减少时,它不会执行任何操作,只会显示 0

**概括**