📚 Angular 18 核心特性速查表
Angular 18 标志着 Angular 彻底告别"旧时代"(v1.x 的残留和复杂的 Module 系统),全面进入 Signal 响应式 和 Standalone 独立组件 时代。
1. 🔄 全新响应式核心:Signal Inputs
这是 Angular 18 最具革命性的变化,彻底改变了父子组件数据传参的方式。
| 特性 | 描述 |
|---|---|
| 旧语法 | @Input() 和 @Output() 分开定义,配合 (inputChange) 实现双向绑定。 |
| 新语法 | model() 函数。集输入、输出、变更检测于一体。 |
| 优势 | 代码量减少 80% ,自动支持响应式更新,不再依赖 ngOnChanges 钩子。 |
代码对比
typescript
// ❌ 旧写法:繁琐
export class OldComp {
@Input() count = 0;
@Output() countChange = new EventEmitter<number>();
// 如果要监听变化,还得写 ngOnChanges
ngOnChanges(changes: SimpleChanges) { ... }
}
// ✅ Angular 18 写法:极简
import { model } from '@angular/core';
export class NewComp {
// count 现在是一个 Signal,既是输入也是输出
// 父组件改了它,它会变;它变了,父组件也会收到通知
count = model(0);
// 在组件内部直接使用 Signal API
increment() {
this.count.update(v => v + 1);
}
}
2. 🎨 新一代控制流
Angular 17 引入,Angular 18 成为标准。废弃了 *ngIf、*ngFor 等指令,改用编译器级的块语法。
| 指令 | 旧写法 (指令式) | 新写法 (块语法) | 关键点 |
|---|---|---|---|
| 条件判断 | <div *ngIf="user">...</div> |
@if (user) { ... } |
逻辑更清晰,支持 @else if。 |
| 列表循环 | <div *ngFor="let u of users">...</div> |
@for (u of users; track u.id) { ... } |
强制要求 track,提升渲染性能。 |
| 空状态 | <div *ngIf="!users.length">...</div> |
@for (u of users; track u.id) { ... } @empty { ... } |
内置空状态块,无需额外判断。 |
代码对比
html
<!-- ❌ 旧写法 -->
<div *ngIf="users.length === 0; else list">Loading...</div>
<ng-template #list>
<div *ngFor="let user of users; trackBy: trackFn">{{user.name}}</div>
</ng-template>
<!-- ✅ Angular 18 写法 -->
@if (users.length === 0) {
<div>Loading...</div>
} @else {
@for (user of users; track user.id) {
<div>{{ user.name }}</div>
}
}
3. 🧱 独立组件
虽然从 v14 开始引入,但在 Angular 18 中,Standalone 是唯一的默认选项。
| 特性 | 描述 |
|---|---|
| 旧语法 | 必须声明 @NgModule,在 declarations 和 imports 中注册组件。 |
| 新语法 | 组件中加上 standalone: true,直接在 imports 数组导入其他组件/指令。 |
| 优势 | 模块化,摇树优化 更友好,降低心智负担。 |
代码对比
typescript
// ❌ 旧写法:Module Hell
@NgModule({
declarations: [UserComponent],
imports: [CommonModule, FormsModule],
exports: [UserComponent]
})
export class UserModule { }
// ✅ Angular 18 写法:清爽
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-user',
standalone: true, // 声明为独立组件
imports: [CommonModule], // 直接用啥导啥
template: `...`
})
export class UserComponent { }
4. 🚀 性能与开发体验提升
除了语法变化,Angular 18 还带来了一些底层的优化:
- Zone.js 可选:
- 默认情况下,Angular 依然使用 Zone.js 来自动检测变化。
- 但新版本提供了更完善的
provideExperimentalZonelessChangeDetection(),允许开发者完全移除 Zone.js,利用 Signal 实现极致性能(类似 React/Svelte 的手动更新模式)。
- Hydration(水合)优化:
- 服务端渲染 (SSR) 的体验大幅提升,减少了客户端接管应用时的闪烁。
- 类型检查增强:
- 新的控制流
@for的track表达式会在编译时进行严格类型检查,防止trackBy写错导致的 Bug。
- 新的控制流
5. 📋 语法快速迁移指南
如果您想将旧项目升级到 Angular 18 风格,请参考以下映射表:
| 场景 | 查找旧代码... | 替换为... |
|---|---|---|
| Input 装饰器 | @Input() name: string; |
name = input<string>(''); |
| 双向绑定 | @Input() val; @Output() valChange |
val = model(0); |
| If 指令 | *ngIf |
@if / @else |
| For 指令 | *ngFor |
@for (...; track ...) |
| Switch 指令 | [ngSwitch] / *ngSwitchCase |
@switch / @case |
| Module 导入 | AppModule |
直接在 main.ts bootstrapApplication |
总结
Angular 18 的核心哲学是:
- 响应式优先 :用 Signal (
input,model,computed) 替代 imperative(命令式)的 Getter/Setter。 - 模板原生化 :用
@if/@for替代 HTML 指令,让模板更像代码。 - 去重化:用 Standalone 组件替代复杂的 NgModule 树。 这种写法让 Angular 代码量大幅减少,运行时性能显著提升,且更容易被 Vue/React 开发者理解。