仮想リスト
仮想リストを使用すると、パフォーマンスを損なうことなく大量の要素を持つリストをレンダリングできます。また、検索バー、無限スクロール、プルツーリフレッシュ、スワイプアウト(スワイプして削除)、ソート可能など、リストを扱うすべてのFramework7コンポーネントと完全に互換性があります。
仮想リストのレイアウト
仮想リストのHTMLレイアウトは非常にシンプルで、通常のリストビューとほぼ同じですが、唯一の違いは、空にしておく必要があることです。
<!-- Virtual List -->
<div class="list virtual-list">
<!-- keep it empty -->
</div>
場所
virtual-list
- 仮想リストを使用するすべてのリストブロックに必要な追加クラス
仮想リストのアプリメソッド
リストのHTMLができたので、初期化する必要があります。必要なアプリメソッドを使用する必要があります。
app.virtualList.create(parameters)- パラメータを使用して仮想リストを初期化します
- parameters - object - 仮想リストパラメータを含むオブジェクト。必須。
- メソッドは初期化された仮想リストインスタンスを返します
app.virtualList.destroy(el)- 仮想リストインスタンスを破棄します
- el - HTMLElement または string(CSSセレクター付き)または object。破棄する仮想リスト要素または仮想リストインスタンス。
app.virtualList.get(el)- HTML要素で仮想リストインスタンスを取得します
- el - HTMLElement または string(CSSセレクター付き)。仮想リスト要素。
メソッドは仮想リストのインスタンスを返します
仮想リストコンテナ(リストブロック要素)は、初期化の時点でDOMにある必要があることに注意してください。
仮想リストのパラメータ
利用可能なすべてのパラメータのリストを見てみましょう
パラメータ | タイプ | デフォルト | 説明 |
---|---|---|---|
el | HTMLElement string | ターゲットリストブロック要素。string の場合は、リストブロック要素のCSSセレクター | |
ul | HTMLElement string | リストブロック内のリスト要素<ul> 。 | |
createUl | boolean | true | 仮想リストブロック内に<ul> 要素を自動的に作成します。無効にすると、仮想リストはul > li 構造なしで任意のブロック要素で使用できます |
items | array | リスト項目を含む配列 | |
rowsBefore | number | 現在の画面スクロール位置より前にレンダリングされる行(項目)の数。デフォルトでは、画面に収まる行(項目)の数の2倍に等しくなります | |
rowsAfter | number | 現在の画面スクロール位置より後にレンダリングされる行(項目)の数。デフォルトでは、画面に収まる行(項目)の数に等しくなります | |
cols | number | 1 | 行ごとの項目数。動的な高さを持つ仮想リストを使用する場合は互換性がありません |
height | number または function(item) または "auto" |
| |
renderItem | function(item) | このオプション関数を使用すると、カスタム関数を使用して項目のHTMLをレンダリングできます。templateパラメータの代わりに使用できます | |
renderExternal | function(vl, renderParameters) | このオプション関数を使用すると、カスタムメソッドを使用してDOM項目をレンダリングできます。たとえば、Vue/Reactプラグインで使用して、DOMのレンダリングと操作をVue/Reactに渡す場合に便利です。renderParameters には、次のプロパティを持つオブジェクトが含まれます:fromIndex 、toIndex 、listHeight 、topPosition 、items | |
emptyTemplate | string | 空のデータが渡された場合のリスト項目テンプレートを定義します | |
dynamicHeightBufferSize | number | 1 | このパラメータを使用すると、動的な高さを持つ仮想リスト(height パラメータが関数の場合)のバッファサイズをバッファサイズ乗数として制御できます |
cache | boolean | true | すでにレンダリングされたリスト項目のDOMキャッシュを無効または有効にします。この場合、各項目は1回だけレンダリングされ、その後の操作はすべてDOM要素を使用して行われます。リスト項目にいくつかのユーザーインタラクション要素(フォーム要素やスワイプアウトなど)がある場合、または変更できる場合に便利です |
updatableScroll | boolean | 現在のデバイスがスクロール中にスクロールイベントを更新および処理するかどうか。デフォルトでは(指定されていない場合)、iOSバージョンが8未満のすべてのiOSデバイスでは「false」になります。 | |
setListHeight | boolean | true | 有効にした場合、リストブロックに高さを設定します |
showFilteredItemsOnly | boolean | false | filterItems メソッドで設定されたフィルター処理された項目のみを表示するオプション |
scrollableParentEl | HTMLElement string | 仮想リストのスクロール可能な親。指定されていない場合は、親の<div class="page-content"> 要素を探します | |
検索バー | |||
searchByItem | function(query, item, index) | 検索バーで使用される検索関数。検索クエリ、項目自体、項目のインデックスを受け取ります。項目が検索クエリに一致する場合はtrue を返す必要があり、それ以外の場合はこの関数はfalse を返す必要があります | |
searchAll | function(query, items) | 検索バーで使用される検索関数。検索クエリとすべての項目を含む配列を受け取ります。項目をループして、一致した項目のインデックスを含む配列を返す必要があります |
仮想リストのメソッドとプロパティ
したがって、仮想リストを作成するには、次を呼び出す必要があります
var virtualList = app.virtualList.create({ /* parameters */ })
仮想リストを初期化すると、変数に(上記の例のvirtualList
変数のように)初期化されたインスタンスがあり、便利なメソッドとプロパティがあります
プロパティ | |
---|---|
virtualList.items | 項目を含む配列 |
virtualList.filteredItems | フィルター処理された項目を含む配列(".filterItems"メソッドを使用した後) |
virtualList.domCache | キャッシュされたdom項目を含むオブジェクト |
virtualList.params | リストの初期化時に渡されたパラメータ |
virtualList.el | 仮想リストのターゲットリストブロック要素 |
virtualList.$el | ターゲットリストブロック要素のDom7インスタンス |
virtualList.pageContentEl | 親の "page-content" 要素 |
virtualList.$pageContentEl | 親の "page-content" 要素のDom7インスタンス |
virtualList.currentFromIndex | 現在最初にレンダリングされた項目のインデックス番号 |
virtualList.currentToIndex | 現在最後にレンダリングされた項目のインデックス番号 |
virtualList.reachEnd | ブール値プロパティ。現在最後にレンダリングされた項目が、指定されたすべての項目の最後の項目である場合はtrue に等しくなります |
メソッド | |
virtualList.filterItems(indexes); | 表示する項目のインデックスを含む配列を渡して、仮想リストをフィルター処理します |
virtualList.resetFilter(); | フィルターを無効にして、すべての項目を再び表示します |
virtualList.appendItem(item); | 項目を仮想リストに追加します |
virtualList.appendItems(items); | 項目の配列を仮想リストに追加します |
virtualList.prependItem(item); | 項目を仮想リストの先頭に追加します |
virtualList.prependItems(items); | 項目の配列を仮想リストの先頭に追加します |
virtualList.replaceItem(index, item); | 指定されたインデックスの項目を新しい項目に置き換えます |
virtualList.replaceAllItems(items); | すべての項目を新しい項目の配列に置き換えます |
virtualList.moveItem(oldIndex, newIndex); | 仮想項目をoldIndexからnewIndexに移動します |
virtualList.insertItemBefore(index, item); | 指定されたインデックスの項目の前に新しい項目を挿入します |
virtualList.deleteItem(index); | 指定されたインデックスの項目を削除します |
virtualList.deleteItems(indexes); | 指定されたインデックス配列の項目を削除します |
virtualList.deleteAllItems(); | すべての項目を削除します |
virtualList.clearCache(); | 仮想リストのキャッシュされたDOM要素をクリアします |
virtualList.destroy(); | 初期化された仮想リストを破棄し、すべてのイベントをデタッチします |
virtualList.update(); | リストサイズの再計算と仮想リストの再レンダリングを含む、仮想リストを更新します |
virtualList.scrollToItem(index); | インデックス番号で指定された項目に仮想リストをスクロールします |
仮想リストのイベント
仮想リストは、アプリと仮想リストインスタンスで次のイベントを発生させます
仮想リストインスタンスは、自身のインスタンスとアプリインスタンスの両方でイベントを発生させます。アプリインスタンスイベントには、同じ名前のプレフィックスvl
が付いています。
イベント | ターゲット | 引数 | 説明 |
---|---|---|---|
itemBeforeInsert | virtualList | virtualList, itemEl, item | 項目が仮想ドキュメントフラグメントに追加される前にトリガーされるイベント |
vlItemBeforeInsert | app | ||
itemsBeforeInsert | virtualList | virtualList, fragment | 現在のDOMリストが削除され、新しいドキュメントが挿入される前にトリガーされるイベント |
vlItemsBeforeInsert | app | ||
beforeClear | virtualList | virtualList, fragment | 現在のDOMリストが削除され、新しいドキュメントフラグメントに置き換えられる前にトリガーされるイベント |
vlBeforeClear | app | ||
itemsAfterInsert | virtualList | virtualList, fragment | 項目が挿入された新しいドキュメントフラグメントが挿入された後にトリガーされるイベント |
vlItemsAfterInsert | app |
例
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Virtual List</div>
<div class="subnavbar">
<form data-search-container=".virtual-list" data-search-item="li" data-search-in=".item-title"
class="searchbar searchbar-init">
<div class="searchbar-inner">
<div class="searchbar-input-wrap">
<input type="search" placeholder="Search" />
<i class="searchbar-icon"></i>
<span class="input-clear-button"></span>
</div>
<span class="searchbar-disable-button">Cancel</span>
</div>
</form>
</div>
</div>
</div>
<div class="searchbar-backdrop"></div>
<div class="page-content">
<div class="block">
<p>Virtual List allows to render lists with huge amount of elements without loss of performance. And it is fully
compatible with all Framework7 list components such as Search Bar, Infinite Scroll, Pull To Refresh, Swipeouts
(swipe-to-delete) and Sortable.</p>
<p>Here is the example of virtual list with 10 000 items:</p>
</div>
<div class="list list-strong list-outline-ios inset-md list-dividers-ios links-list">
<ul>
<li>
<a href="/virtual-list-vdom/">Virtual List VDOM</a>
</li>
</ul>
</div>
<div class="list list-strong list-outline-ios inset-md list-dividers-ios simple-list searchbar-not-found">
<ul>
<li>Nothing found</li>
</ul>
</div>
<div class="list list-strong list-outline-ios inset-md list-dividers-ios virtual-list media-list searchbar-found">
</div>
</div>
</div>
</template>
<script>
export default (props, { $f7, $el, $theme, $onMounted, $onBeforeUnmount }) => {
let items = [];
let virtualList;
for (let i = 1; i <= 10000; i++) {
items.push({
title: 'Item ' + i,
subtitle: 'Subtitle ' + i
});
}
$onMounted(() => {
virtualList = $f7.virtualList.create({
// List Element
el: $el.value.find('.virtual-list'),
// Pass array with items
items,
// Custom search function for searchbar
searchAll: function (query, items) {
var found = [];
for (var i = 0; i < items.length; i++) {
if (items[i].title.toLowerCase().indexOf(query.toLowerCase()) >= 0 || query.trim() === '') found.push(i);
}
return found; //return array with mathced indexes
},
// List item render
renderItem(item) {
return `
<li>
<a class="item-link item-content">
<div class="item-inner">
<div class="item-title-row">
<div class="item-title">${item.title}</div>
</div>
<div class="item-subtitle">${item.subtitle}</div>
</div>
</a>
</li>`;
},
// Item height
height: $theme.ios ? 65 : 69,
});
});
$onBeforeUnmount(() => {
virtualList.destroy()
});
return $render;
}
</script>