Framework7 - 虚拟列表
描述
虚拟列表是一种列表视图,它包含大量数据元素而不会降低其性能。您可以使用 virtual-list 类以及 list-block 类创建虚拟列表的 HTML 布局。
初始化虚拟列表
您可以使用以下方法初始化虚拟列表 −
myApp.virtualList(listBlockContainer, parameters)
该方法包含以下参数 −
listBlockContainer − 它是列表块容器所需的 HTML 或字符串元素。
parameters −它是一个必需的对象,其中包含虚拟列表参数。
虚拟列表参数
下表提供了虚拟参数列表 −
S.No | 参数 &描述 | 类型 | 默认 |
---|---|---|---|
1 | items 提供数组项列表。 |
array | - |
2 | rowsBefore 定义在滚动屏幕位置之前要显示的行数。 |
number | - |
3 | rowsAfter 定义滚动屏幕位置后要显示的行数。 |
number | - |
4 | cols 指定每行的项目数。 |
number | 1 |
5 | height 此参数返回项目高度(单位为 px)。 |
number 或 function (item) | 44 |
6 | template 它表示单个项目。 |
字符串或函数 | - |
7 | renderItem 它使用自定义函数显示项目 HTML。 |
function (index, item) | - |
8 | dynamicHeightBufferSize 它指定虚拟列表上的缓冲区大小以及动态高度。 |
数字 | 1 |
9 | cache 您可以启用或禁用项目列表的 DOM 缓存。 |
boolean | true |
10 | updatableScroll 当您滚动页面时,它会更新设备并操纵滚动事件。 |
boolean | - |
11 | showFilteredItemsOnly 使用filter()方法显示过滤后的项目。 |
boolean | false |
12 | searchByItem 用于使用搜索栏搜索项目,使用搜索查询、项目索引和项目本身作为参数。 |
function (query, index, item) | - |
13 | searchAll 用于使用搜索栏搜索所有项目,使用搜索查询和项目数组作为参数。 |
function (query, items) | - |
14 | onItemBeforeInsert 在将项目插入虚拟文档片段之前执行回调函数。 |
function (list, item) | |
15 | onBeforeClear 在删除 DOM 列表并替换为新文档片段之前执行回调函数。 |
function (list, item) | |
16 | onItemsBeforeInsert 在删除 DOM 列表之后和插入新文档片段之前执行回调函数。 |
function (list, item) | |
17 | onItemsAfterInsert 在插入带有新文档片段的项目后执行回调函数。 |
function (list, item) |
虚拟列表属性
S.No | 属性 &描述 |
---|---|
1 | myList.items 显示包含项目的数组。 |
2 | myList.filteredItems 显示包含已筛选项目的数组。 |
3 | myList.domCache 表示包含 DOM 缓存的项目。 |
4 | myList.params 显示传递的参数初始化。 |
5 | myList.listBlock 指定DOM7实例的列表块容器。 |
6 | myList.pageContent 指定DOM7实例的页面内容容器。 |
7 | myList.currentFromIndex 显示第一个渲染的项目。 |
8 | myList.currentToIndex 显示最后一个渲染的项目项。 |
9 | myList.reachEnd 如果为真,则显示所有指定项的最后一项。 |
虚拟列表方法
S.No | 方法和说明 |
---|---|
1 | myList.filterItems(indexes); 您可以使用带索引的数组来过滤项目。 |
2 | myList.resetFilter(); 通过阻止过滤器显示所有项目。 |
3 | myList.appendItem(item); 它将项目附加到虚拟列表中。 |
4 | myList.appendItems(items); 它将项目数组附加到虚拟列表。 |
5 | myList.prependItem(item); 它将项目添加到虚拟列表的前面。 |
6 | myList.prependItems(items); 它将项目数组添加到虚拟列表的前面。 |
7 | myList.replaceItem(index, items); 它将指定索引处的项目替换为新项目。 |
8 | myList.replaceAllItems(items); 它将所有项目替换为新项目。 |
9 | myList.moveItem(oldIndex, newIndex); 它将项目从旧索引转移到新索引。 |
10 | myList.insertItemBefore(index, item); 您可以在指定索引之前插入项目索引。 |
11 | myList.deleteItem(index); 您可以删除指定索引处的项目。 |
12 | myList.deleteItems(indexes); 您可以删除指定索引数组处的项目。 |
13 | myList.deleteAllItems(); 它将删除所有项目。 |
14 | myList.clearCache(); 用于清除DOM元素的缓存。 |
15 | myList.destroy(); 销毁虚拟列表及其事件。 |
16 | myList.update(); 更新虚拟列表并重新渲染虚拟列表。 |
17 | myList.scrollToItem(index); 可以滚动虚拟列表使用索引号将项目添加到项目。 |
模板化
有时您需要使用某种逻辑从 JSON 数据中过滤或加载项目。为此,您可以使用 items 参数和 template 参数或使用 renderItem 参数传递包含数据对象的数组。
您可以按如下方式使用 Framework7 template 参数 −
var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], // Display the each item using Template7 template parameter template: '<li class = "item-content">' + '<div class = "item-media"><img src = "{{image}}"></div>' + '<div class = "item-inner">' + '<div class = "item-title">{{name}}</div>' + '</div>' + '</li>' });
您还可以使用自定义渲染函数,如下所示 −
var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], // Display the each item using custom render function renderItem: '<li class = "item-content">' + '<div class = "item-media"><img src = "{{image}}"></div>' + '<div class = "item-inner">' + '<div class = "item-title">{{name}}</div>' + '</div>' + '</li>' });
使用搜索栏
您可以使用 searchAll 或 searchByItem 参数,以便使用带有虚拟列表的搜索栏,该虚拟列表在参数中提供搜索功能。
var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], //在这里您可以搜索数组中的所有项目并返回包含匹配项目的数组 searchAll: function (query, items) { var myItems = []; for (var i = 0; i < items.length; i++) { // 在这里检查名称是否包含查询字符串 if (items[i].name.indexOf(query.trim()) >= 0) myItems.push(i); } // 返回包含匹配项索引的数组 return myItems; } });
使用 searchByItem 参数 −
var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], //在这里您可以搜索数组中的所有项目并返回包含匹配项目的数组 searchByItem: function (query, index, items) { // 在这里检查名称是否包含查询字符串 if (items[i].name.indexOf(query.trim()) >= 0){ return true; } else { return false; } } } });
动态高度
您可以使用 height 参数(而不是数字)为项目使用动态高度。
var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], //template parameter template: '...', //using height function height: function (item) { if (item.image) return 120; //显示高度为 100px 的图像 else return 50; //显示高度为 50px 的图像 } });
API 方法
您可以使用 API 方法添加、删除、替换或移动虚拟列表项。
//您可以在此处初始化列表 var myVal = myApp.virtualList('.list-block.virtual-list', { //数组项列表 items: [ { name: 'Element 1', image: '/path/image1.jpg' }, { name: 'Element 2', image: '/path/image2.jpg' }, // ... { name: 'Element 50', image: '/path/image50.jpg' }, ], //template parameter template: '...', }); //此处附加您的项目 myVal.appendItem({ image: 'Element 55' }); // 点击按钮时您可以附加多个项目 $('.button.append-items').on('click', function () { //You can append multiple items by passing array with items myVal.appendItem ([ { image: 'Element 60' }, { image: 'Element 61' }, { image: 'Element 62' } ]); }); //替换第一项 myList.replaceItem(0, { name: 'Element 4' }); //单击按钮时可以显示前 10 项 $('.button.show-first-10').on('click', function () { //传递带有索引的数组以显示项目 myList.filter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); }); //重置过滤器 $('.button.reset-filter').on('click', function () { myList.resetFilter(); }); //可以在第 4 项和第 5 项之前插入该项目 myList.insertItemBefore(1, { name: 'Element 4.5' });