第3章 组件通信与数据绑定面试

在 Angular 面试中,组件通信与数据绑定是必考的核心能力。面试官常通过 父子传值、EventEmitter、双向绑定 及 Component API 来考察你对数据流和变更检测的理解。本章精选 3 个高频问答,配合回答框架图和追问路径图,帮助你快速掌握结构化表达。

1. 明确通信场景 父子 / 兄弟 / 跨级 2. 选择通信策略 @Input/@Output / Service 3. 实现双向绑定 [(ngModel)] 或自定义 4. 处理事件与检测 emit() / ngOnChanges 5. 测试与优化 单元测试 / OnPush 父子传值 @Input / @Output setter? 只读? ngOnChanges 监变 EventEmitter 类型安全? 取消订阅? emit() 变更检测 双向绑定 自定义? vs ngModel xxxChange 约定

面试问答 1:父子组件如何通信?

面试问题:请解释 Angular 中父子组件如何实现通信?

考察点:对 @Input、@Output、EventEmitter 的理解,以及单向数据流原则。

回答框架:先划分输入与输出角色,再说明装饰器使用,最后强调数据流方向与不可变性。

示例回答:父组件通过 @Input 绑定传递数据,子组件通过 @Output 和 EventEmitter 发射事件。这是单向数据流的核心,保证了数据可追溯。使用 setter 或 ngOnChanges 可监听输入变化。

可能追问:如果我想监听输入属性的变化,除了 setter 还有什么方法?
答:ngOnChanges 生命周期钩子,它接收 SimpleChanges 对象,可获取当前值与上一次值。

避坑提醒:不要直接在子组件中修改父组件传入的对象,应使用不可变对象或通过事件通知父组件修改。

面试问答 2:Angular 中双向绑定的实现方式?

面试问题:如何在 Angular 中实现双向绑定?有哪些方式?

考察点:熟悉 [(ngModel)] 的语法糖原理,以及自定义双向绑定的约定(xxxChange)。

回答框架:区分内置 ngModel 与自定义绑定;说明语法糖本质是属性绑定 + 事件绑定。

示例回答:内置双向绑定使用 [(ngModel)],需导入 FormsModule。自定义双向绑定通过同时实现 @Input() 和 @Output() 属性名符合 “xxxChange” 约定,在子组件中 emit 变更事件。

可能追问:自定义双向绑定中,如何确保变更检测正确触发?
答:使用 EventEmitter.emit() 发射新值,Angular 自动触发变更检测。若使用 OnPush 策略需手动调用 markForCheck()。

避坑提醒:不要混淆双向绑定与单向绑定的使用场景,双向绑定适合表单,单向绑定适合业务逻辑层。

面试问答 3:组件通信的多种方式及优劣比较

面试问题:请列举 Angular 组件通信的几种方式,并比较优劣。

考察点:全面了解组件通信方案,包括父子、兄弟、跨级场景的选择依据。

回答框架:按通信层级分类:父子(@Input/@Output)、兄弟(共用 Service)、跨级(依赖注入或状态管理)。

示例回答:父子通信使用 @Input/@Output;兄弟通信通过共用 Service 加 Subject;跨级通信可使用依赖注入或 NgRx 状态管理。选择依据是通信范围和复杂度,小范围优先用装饰器。

可能追问:如果组件层级很深,如何避免逐层传递?
答:使用服务注入或全局状态管理,例如将数据放在服务中并通过依赖注入提供,子组件直接注入服务获取数据。

避坑提醒:过度使用全局状态管理会导致架构复杂,小范围通信优先使用 @Input/@Output。

💡 结构化表达要点:回答组件通信问题时,遵循 场景 → 策略 → 实现 → 注意事项 的逻辑,配合流程图中 5 个步骤,让面试官看到你的架构思维。