关于 angular-signals
面向 Angular Signals 开发者的参考技能,涵盖 Angular 16 及后续版本的状态管理、响应式编程和 API 指引,并说明派生值、副作用及 RxJS 互操作实践。
主要功能
- 01可写信号与派生信号
- 02信号输入与 Resource API
- 03RxJS 互操作
- 04副作用清理指引
- 05版本相关的 API 说明
适用场景
- 01管理响应式 UI 状态
- 02从信号派生数据
- 03连接 Observable 与信号
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-signals安装后在 Claude Code 中输入/angular-signals确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md详细介绍
Angular Signals
版本: Angular 16+(2025) 标签: 响应式、状态管理、Signals API
参考: Angular Signals • API 参考
API 变更
本节介绍特定版本的 API 变更。
-
新增:Angular 19 Resource API — 以全新方式处理异步数据,并内置加载/错误状态
-
新增:linkedSignal() — 创建与外部来源关联、带有 getter/setter 的 signal 来源
-
新增:Signal 输入 — 使用
input()和input.required()实现响应式组件输入 -
新增:
toSignal()和toObservable()— 在 RxJS 与 Signals 之间搭建桥接 -
新增:
effect()改进 — 通过onCleanup回调更好地清理 -
新增:无 Zone 变更检测 — 与 Signals 无缝协作
最佳实践
- 使用
computed()派生状态 — 切勿使用effect()派生值
// ✅ DO THIS - derived state
totalPrice = computed(() => {
return this.items().reduce((sum, item) => sum + item.price, 0);
});
// ❌ DON'T - side effects in computed
badComputed = computed(() => {
const data = this.data();
this.logService.log(data); // Side effect - don't do this!
});
- 使用
signal()创建可写状态
count = signal(0);
// Update with set()
count.set(5);
// Update with update()
count.update(value => value + 1);
// Update with mutate() for objects
user.update(u => ({ ...u, name: 'New Name' }));
- 仅将
effect()用于副作用
effect(() => {
analytics.track('cart-updated', {
itemCount: this.items().length
});
});
- 始终清理 effects,避免内存泄漏
effect((onCleanup) => {
const timer = setTimeout(() => { /* ... */ }, 300);
onCleanup(() => clearTimeout(timer));
});
- 使用 Signal 输入,而非传统的 @Input()
// Modern signal inputs (Angular 17+)
userId = input<string>('');
user = input.required<User>();
// Computed based on input
greeting = computed(() => `Hello, ${this.user()?.name}`);
- 使用
toSignal()将 RxJS 转换为 Signal
// Convert Observable to Signal
users = toSignal(this.http.get('/api/users'), { initialValue: [] });
-
不要嵌套 effects — 可能导致性能问题
-
对复杂对象比较使用相等性函数
user = signal<User | null>(null, {
equal: (a, b) => a?.id === b?.id
});
- UI 状态使用 Signals,复杂异步操作使用 RxJS — Signals 和 RxJS 用途不同
评论
支持 Markdown