尝试使用Angular CDK布局
首先
因为之前一直想尝试却没有动手,最近我稍微接触了一下Angular CDK,所以我想留下一些笔记。
你可以通过查看@Quramy的《Angular Component Dev Kit入门》一文,了解Angular中CDK所提供的功能以及为什么要学习CDK的原因等内容,从而更容易理解。
我尝试使用Angular CDK中易于理解的API,即使不是库的开发者,也可以直接在应用程序的实现中使用它提供的布局。
公式文档:https://material.angular.io/cdk/layout/overview
准备就绪
安装
$ ng new cdk-test
$ cd cdk-test
$ npm i @angular/cdk
使用Angular Material的项目应该已经安装了CDK,所以不需要再安装。
将CDK模块导入
将LayoutModule导入到app.module中,并将其添加到AppModule的imports中。
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { LayoutModule } from '@angular/cdk/layout'; // 追加
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
LayoutModule, // 追加
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
到目前为止,CDK Layout的功能已经准备就绪,可以开始使用了。
断点观察者
使用BreakpointObserver,可以通过Observable接收到与预先设定的断点相对应的屏幕尺寸变化。在创建响应式屏幕时,通过使用*ngIf等功能非常方便。
获取通知画面大小变化的Observable。
这次我们将在 app.component 中直接使用 BreakpointObserver。(实际上,在实际使用时,最好将其拆分为一个服务)
import { Component, OnInit } from '@angular/core';
import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
isMobile$: Observable<boolean> = of(false);
constructor(private breakpointObserver: BreakpointObserver) {}
ngOnInit() {
// BreakpointObserverから画面幅の変更を取得してBooleanに変換
this.isMobile$ = this.breakpointObserver.observe(Breakpoints.XSmall).pipe(
map((state: BreakpointState) => state.matches)
);
// consoleで確認
this.isMobile$.subscribe((isMobile: boolean) => console.log('isMobile:', isMobile));
}
}
-
- BreakpointObserverをDIする
- BreakpointObserver.observeにブレイクポイント情報を渡して変更を通知するObservableを取得
将断点设置为用户定义的值
如果要设置除预先准备的Breakpoints以外的值,可以按照以下的方式,以css媒体查询的格式将断点信息传递给observe函数。
this.breakpointObserver.observe('(max-width: 768px)')...
如果需要严格指定最小值和最大值的情况下,请使用数组传递。
this.breakpointObserver.observe([
'(min-width: 480px)',
'(max-width: 768px)',
])...
媒体匹配器
MediaMatcher.matchMedia()是Window.matchMedia()的包装器。它可以在Angular的类内同步地获取CSS媒体查询是否满足条件的信息。
import { Component, OnInit } from '@angular/core';
import { MediaMatcher } from '@angular/cdk/layout';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private mediaMatcher: MediaMatcher) {}
ngOnInit() {
// 戻り値はネイティブのMediaQueryList型を返す
const mediaQueryList = this.mediaMatcher.matchMedia('(min-width: 1000px)');
// consoleで確認
console.log(mediaQueryList);
}
}
当查看BreakpointObserver的实现时,可以看到在MediaMatcher.matchMedia()中获取的MediaQueryList上添加了addListener。相比于BreakpointObserver,我认为直接使用这个API的情况并不太多。
结束
虽然内容相当粗糙且没有整理好,但希望能够抓住Angular CDK布局(尤其是BreakpointObserver)的感觉。
我还想尝试其他CDK模块的功能。