Angular CDK 响应式工具概述
Angular CDK(Component Dev Kit)提供了一套响应式工具,帮助开发者轻松实现自适应布局。主要依赖@angular/cdk/layout模块,通过监听视口变化动态调整UI。
安装与基础配置
确保已安装Angular CDK:
bash
npm install @angular/cdk
在模块中导入LayoutModule:
typescript
import { LayoutModule } from '@angular/cdk/layout';
@NgModule({
imports: [LayoutModule]
})
断点监听与响应
使用BreakpointObserver监听常见断点(如Handset、Tablet等):
typescript
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
constructor(private breakpointObserver: BreakpointObserver) {
this.breakpointObserver.observe([
Breakpoints.Handset,
Breakpoints.Tablet
]).subscribe(result => {
this.isHandset = result.matches;
});
}
自定义断点配置
扩展默认断点以适配特定需求:
typescript
const customBreakpoints = {
XSmall: '(max-width: 599px)',
Small: '(min-width: 600px) and (max-width: 959px)'
};
this.breakpointObserver.observe([
customBreakpoints.XSmall
]).subscribe(/*...*/);
动态样式绑定
结合ngClass或ngStyle实现条件样式:
html
<div [ngClass]="{
'mobile-view': isHandset,
'desktop-view': !isHandset
}"></div>
组件布局切换策略
利用*ngIf或<ng-template>根据断点切换组件:
html
<ng-container *ngIf="!(isHandset | async); else mobileMenu">
<desktop-navigation></desktop-navigation>
</ng-container>
<ng-template #mobileMenu>
<mobile-drawer></mobile-drawer>
</ng-template>
性能优化技巧
避免频繁变更检测,使用async管道:
typescript
isHandset$ = this.breakpointObserver.observe(Breakpoints.Handset).pipe(
map(result => result.matches)
);
服务端渲染(SSR)兼容方案
注入PLATFORM_ID避免SSR时报错:
typescript
import { isPlatformBrowser } from '@angular/common';
constructor(
@Inject(PLATFORM_ID) private platformId: Object
) {
if (isPlatformBrowser(this.platformId)) {
// 只在浏览器环境执行断点监听
}
}
响应式工具链扩展
结合FlexLayoutModule增强布局能力:
typescript
import { FlexLayoutModule } from '@angular/flex-layout';
@NgModule({
imports: [FlexLayoutModule]
})
调试与测试方案
使用fakeAsync测试断点变化:
typescript
it('should respond to viewport changes', fakeAsync(() => {
window.dispatchEvent(new Event('resize'));
tick(300); // 等待防抖
// 断言逻辑
}));