見出し画像

Velo 第64回 レイジー・ロード

まとまった量のコンテンツをリピータで一度に表示してしまうと時間もかかり、またどれを見たものかと困惑する事にもなります。

レイジー・ロードという表示方法はその解決法の1つです。
ここではレイジー・ロードを含めて、データセットでリピータ表示を制御するコーディングを考えてみましょう。

データセットのページ

データセットはCMSからページという単位でデータを取得しています。そしてページサイズは、リピータが最初に表示するアイテムの個数を決定しています。写真アルバムのページと同じ感覚ですね。

ページサイズはエディターでリピータに設定した「アイテム最大表示数」の値と一致しています。ただしテーブルやギャラリーはこの影響を受けません。下図では値を2に設定しています。

アイテム最大表示数

各ページには1から始まるページ番号が振ってあり、次のページや、前のページを指定したり、移動したりすることができます。写真アルバムと全く同じですね。また次のページがあるか、前のページがあるかをブール値で判断する事もできます。

表示ページを制御する

データセットの表示ページを制御してみましょう。CMS(myCollection)には7人の登録がしてあります。2アイテムずつ表示すると4ページが必要になります。

CMS(myCollection)

サイトのページにはデータセット(myDataset)にリンクしたリピータ(myRepeater)とそれを制御する3つのボタンがあります。左のボタン(prevPageButton)は前のページを表示するボタン、右のボタン(nextPageButton)が次のページを表示するボタン、真ん中のボタン(cyclPageButton)はサイクリックにページを表示するボタンです。

サイトページ

また画面下部の文房具の背景はストリップ(columnStrip)でここが視野に入ればレイジーロードするようにします。

コーディング

以下の様に4つの機能を各ボタンやストリップに割り当てましょう。

コーディング

hasPreviousPage( ) と previousPage( )

1行目~5行目で左のボタン(prevPageButton)に前のページが存在するならそのページを表示するようにクリックイベントを仕掛けています。例えば現在2ページ目の表示中なら、1ページ目を表示させるコーディングになります。前のページがない、つまり1ページ目の表示中なら何も起こりません。

hasNextPage( ) と nextPage( )

7行目~11行目で右のボタン(nextButton)に次のページが存在するならそのページを表示するようにクリックイベントを仕掛けています。例えば現在3ページ目の表示中なら、4ページ目を表示させるコーディングになります。次のページがない、つまり4ページ目の表示中なら何も起こりません。

getCurrentPageIndex( ) と loadPage( )

13行目~17行目で真ん中のボタン(cyclButton)に次のページを循環的に表示するようにクリックイベントを仕掛けています。表示中のページ番号を取得し、それを1つ増やして次のページ番号を作っていますが、4で割った余りを使ってページ番号を循環させています。従って4ページ目の次は1ページに目に戻りますので終わりなくページの循環が期待できます。

loadMore( ) とレイジー・ロード

19行目~22行目でレイジー・ロードを定義しています。画面をスクロ ールしてストリップ(columnStrip)が視野に入ったときに次の1ページを加算してロードします。従ってリピータにはさらに2アイテムが追加表示されます。

loadPage( ) では引数で与えられたページ番号を表示するだけなので常に2アイテムしか表示しませんが、loadMore( ) は加算されるところが異なります。従って4アイテム、6アイテムと表示が増えていきます。一気に表示させずスクロールに応じてリピータ表示が増える仕掛けです。

表示はどんどん増えますが、端数を含む最後のページを除き必ず2アイテムずつ増えます。これはページサイズが2だからです。写真アルバムのページと全く同じことです。

戻り値はプロミス

previousPage( )、nextPage( )、loadPage( )、loadMore( ) はすべて戻り値がプロミスです。従って async/await 演算子を使って非同期でコーディングしています。

レイジーロードの実装例

Velo開発のご依頼はこちら

いいなと思ったら応援しよう!