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>'
});

使用搜索栏

您可以使用 searchAllsearchByItem 参数,以便使用带有虚拟列表的搜索栏,该虚拟列表在参数中提供搜索功能。

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'
});

framework7_list_views.html