我的觀點是 Signal 是 Angular 的現在與未來。
我的理由:
viewChild.required()
、viewChildren()
、contentChild.required()
和 contentChildren()
查詢元素。 ngAfterViewInit
和 ngAfterContentInit
在極少數情況下使用。markForCheck
標誌變髒,隨後的 change detection 會更新組件的 範本。自從採用 signal 以來,我使用 effect
的次數比 ngOnChanges
方法還要多。signal
和 signal inputs
是 type-safe 的並消除了棘手的錯誤。例如,signal(1)
推斷類型是數字,或 signal<T>()
宣告它需要 T
類型。另一方面, viewChild.required()
、viewChildren()
、viewChild()
、contentChild()
、contentChild.required()
、contentChildren()
函數可以使用 read
選項來提供準確的類型。signal
在 Zoneless Angular 中發揮著重要作用。 signal
可以直接呼叫 change detection,從而消除基於 zone 的 change detection 的開銷。這減少了套件的大小,提高了效能,並減少了不必要的更新和重新渲染。It looks like #Angular v19 will have a set of signal based migrations with
Signal Inputs
new Outputs
Signal Queries
While I don't expect them to be perfect, they will help a lot to shift exisiting codebases to those new features.
在Angular 19 中,現有的應用程式可以執行內建的Angular schematic,將裝飾器 (decorators) 遷移到 signal 函數。 ngxtension
函式庫可以逐漸淘汰他們的遷移 schematic,這些 schematic 做了同樣的事情以促進遷移。
X tweet:
(https://x.com/Jean__Meche/status/1827088344414593039?t=pAzILz8okbB9wysWsuePGw&s=03)
Angular elements will finally support signal, signa input and the new output function in V19
我希望所有部落格文章和 Stackblitz 演示最終都能說服 Angular 開發人員開始在他們的專案中使用 signal。
鐵人賽的第 30 天到此結束。
參考:
請問,原本生命週期(ngChange或afterViewInit)改成signal後,
監聽從一個變成很多個(ex.每個signal input都一個),
這樣效能會不會反而降低?
Angular 團隊的回應: "In principle - no.
Signals are guaranteed to recompute only once (for a given set of dependent values - no dependency change => no recompute) and will cache their value.
In this sense signals are optimized for repeated reads - no need to cache values manually (it is actually counter productive as requires more code and signals will do caching anyway)
"
Google translate:
保證訊號僅重新計算一次(對於給定的一組依賴值 - 無依賴關係更改 => 不重新計算)並將快取其值。
從這個意義上說,訊號針對重複讀取進行了最佳化 - 無需手動快取值(這實際上是適得其反的,因為需要更多程式碼,而訊號無論如何都會進行快取)