20
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AngularAdvent Calendar 2018

Day 16

Anguar Material CDK の Virtual Scrolling を触ってみた

Last updated at Posted at 2018-12-16

#はじめに
この記事は Angular Advent Calendar 2018 16日目の記事です。

Angular7がリリースされ、CDK に DragDropModule や ScrollingModule が追加されました。これらをインポートすると Drag and Drop や Virtual Scrolling が利用できます。
触ってみたかったのでサンプルに沿って少し触ってみました。

Drag and Drop に関しては [Angular Advent Calendar 2018 8日目の記事] (https://qiita.com/swfz/items/ac8daecad48d6dc948c0) で @swfz さんが書かれています!
本記事では Virtual Scrolling を触ってみた件について書きます。

認識違い等ありましたらご指摘いただけるとありがたいです。

#まずv7にアップグレードする
ローカル環境がv6だったのでまずv7にあげました。

こちらを参照し該当する条件を選択
image.png

「Show me how to update!」クリック
image.png
表示された手順に沿ってアップグレードします。

ng update @angular/cli @angular/coreを実行したところ
Could not find a package.json. Are you in a Node project?と出たので、先に
ng new [任意のプロジェクト名]で新規プロジェクト作成後そのフォルダに移動して再度
ng update @angular/cli @angular/coreを実行しました。

バージョンを確認します。
image.png

v7になりました。

この方法だとプロジェクト単位のアップグレードになるので開発環境がまるっとv7になってOKであればnpm install -g @angular/cliを実行すればOKです。

上記手順を踏んだ後、npm install -g @angular/cliも試してみた所、先ほどのプロジェクト配下以外でもv7になったことが確認できました。この後はv7でプロジェクトを作成して進めていきます。

#新しくプロジェクトを作成
ng new virtual-scrolling-sample
で新規プロジェクトを作成します。
routingはなし、cssはscssを選択しました。

$ ng new virtual-scrolling-sample
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? SCSS   [ http://sass-lang.com  
 ]

ng serve -oで起動します。
image.png
起動できました。

#CDK を入れてみる
新規作成したプロジェクト配下で以下コマンドを実行します。(参考
npm install --save @angular/cdk

#サンプルを参考に Virtual Scrolling を入れてみる

ではサンプルを見つつVirtual Scrallを使ってみたいと思います。
一番シンプルそうなサンプルを参照。
https://material.angular.io/cdk/scrolling/overview#creating-items-in-the-viewport

まず、src/app/app.module.tsScrollingModule をインポートします。

src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ScrollingModule } from '@angular/cdk/scrolling';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, ScrollingModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

次にsrc/app/app.component.tsを修正します。
サンプルのコードのように
items = Array.from({ length: 100000 }).map((_, i) => `Item #${i}`);を追加してデータを用意します。

src/app/app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  items = Array.from({ length: 100000 }).map((_, i) => `Item #${i}`);
}

htmlとcssもサンプルからコピーします。

src/app/app.component.html
<cdk-virtual-scroll-viewport itemSize="50" class="example-viewport">
  <div *cdkVirtualFor="let item of items" class="example-item">{{ item }}</div>
</cdk-virtual-scroll-viewport>
src/app/app.component.scss
.example-viewport {
  height: 200px;
  width: 200px;
  border: 1px solid black;
}

.example-item {
  height: 50px;
}

動いた:clap:

scroll1.mov.gif

簡単、サクサク。

#コンテキスト変数を使ってみる
*cdkVirtualForでは以下コンテキスト変数がサポートされています。(詳細はドキュメント参照。)

コンテキスト変数 説明
index データソース内のアイテムのインデックス
count データソース内のアイテムの合計数
first データソースの最初の項目であるかどうか
last データソースの最後の項目かどうか
even indexが偶数であるかどうか
odd indexが奇数であるかどうか

以下のようにlet even = even;,let odd = odd"のように書くことでテンプレートで使えるようになります。
奇数行、偶数行で表示する画像を変えるようにしてみました。

src/app/app.component.html
<cdk-virtual-scroll-viewport itemSize="150" class="example-viewport">
  <div
    *cdkVirtualFor="let item of items; 
                    let even = even; 
                    let odd = odd"
                    class="example-item">
    <p>{{ item }}</p>
    <ng-container *ngIf="even">
      <img src="../assets/img/me.jpg" />
    </ng-container>
    <ng-container *ngIf="odd">
      <img src="../assets/img/nise.jpg" />
    </ng-container>
  </div>
</cdk-virtual-scroll-viewport>

cssも少し調整。

src/app/app.component.scss

.example-viewport {
  height: 500px;
  width: 200px;
  border: 1px solid black;
}

.example-item {
  height: 150px;
}

img {
  width: 100px;
}

奇数行、偶数行で画像が変わりました:clap:
scroll2.mov.gif

まとめ

実は Angular Material を触ったことがなかったのでこれを機に触れて良かったです。
試してみるのはとっても簡単でした!他の機能も触って見ようと思います。

明日のAngular Advent Calendar 2018 担当は @ynishimura0922 さんです!

20
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?