组件与模板
Angular 组件由 TypeScript 类、模板与样式组成,通过 @Component 装饰器配置。见 Angular 基础。
组件定义
import { Component, input, output, signal } from "@angular/core";
@Component({
selector: "app-counter",
standalone: true,
template: `
<button type="button" (click)="increment()">{{ count() }}</button>
`,
})
export class CounterComponent {
/** 父组件可绑定:[initial]="5" */
initial = input(0);
changed = output<number>();
count = signal(0);
increment() {
this.count.update((c) => c + 1);
this.changed.emit(this.count());
}
}
上例使用 Signal 与 input/output API(Angular 17.1+ 推荐);signal 需从 @angular/core 导入。
数据绑定
| 语法 | 方向 | 示例 |
|---|---|---|
{{ expr }} | 插值 | {{ title }} |
[property]="expr" | 属性绑定 | [disabled]="isBusy" |
(event)="handler()" | 事件绑定 | (click)="save()" |
[(ngModel)] | 双向(须导入 FormsModule) | 见 表单 |
[class.foo] / [style.width.px] | 类与样式 | 按表达式切换 |
内置控制流(Angular 17+)
推荐使用新语法(编译期优化,无需 CommonModule 中的 *ngIf 等结构指令即可使用控制流块):
@if (user(); as u) {
<p>{{ u.name }}</p>
} @else {
<p>未登录</p>
}
@for (item of items(); track item.id) {
<li>{{ item.label }}</li>
} @empty {
<li>暂无数据</li>
}
@switch (status()) {
@case ('ok') { <span>成功</span> }
@default { <span>未知</span> }
}
track 表达式用于列表 diff,规则类似 React/Vue 的 稳定 key。
指令与管道
- 结构型指令(旧):
*ngIf、*ngFor仍可用,新项目优先@if/@for。 - 属性型指令:如
NgClass、NgStyle(@angular/common)。 - 管道:模板内转换显示,如
{{ date \| date:'short' }};纯管道利于变更检测。
内容投影
<!-- 父模板 -->
<app-card>
<h2 card-title>标题</h2>
<p>正文</p>
</app-card>
<!-- app-card 模板 -->
<ng-content select="[card-title]" />
<ng-content />
与 Vue / React 对照(简表)
| Angular | Vue 3 | React | |
|---|---|---|---|
| 模板 | HTML + 指令 | SFC template | JSX |
| 输入 | input() / @Input | defineProps | props |
| 输出 | output() / @Output | defineEmits | 回调 props |
参考文献
以下链接在编写时均可正常访问:
相关文章
生态集成
Angular 官方维护路由、HTTP、表单、动画等;UI 与状态扩展由社区与官方 Material 团队提供。涵盖官方/半官方库、常用第三方库、与 Vue/React 生态对照、选型建议与常见坑。
Signal 基础
Signals 是 Angular 16 引入的响应式原语:可读写的 signal、派生的 computed、副作用 effect。用于组件内状态与跨组件细粒度更新,涵盖 API、input signal、与变更检测的关系、最佳实践与常见坑。
RxJS 互操作
Angular 内置 RxJS 处理异步流(HTTP、HttpClient、路由事件、FormControl 的 valueChanges 等)。Signal 适合同步/短链路状态;长生命周期流仍常用 Observable。涵盖 async 管道、toSignal/toObservable、常用操作符、最佳实践与常见坑。
表单
Angular 提供 响应式表单(Reactive Forms) 与 模板驱动表单(Template-driven)。复杂表单推荐 Reactive Forms(模型在 TypeScript 中,易测试)。涵盖 FormGroup/FormArray、Typed Forms、自定义校验器、最佳实践与常见坑。
状态管理
Angular 没有强制单一状态库:服务 + DI、Signal、RxJS 即可覆盖多数场景;大型应用可选用 NgRx。涵盖选型、服务作为状态容器、跨组件共享、NgRx 与 SignalStore、常见坑。
HTTP 与数据
Angular 通过 HttpClient(@angular/common/http)发起 HTTP 请求,返回 RxJS Observable。见 RxJS 互操作、依赖注入。