Framework7 - 虚拟列表



描述

虚拟列表是一种列表视图,包含大量数据元素,而不会降低其性能。您可以使用virtual-list 类以及list-block 类创建虚拟列表的 HTML 布局。

初始化虚拟列表

您可以使用以下方法初始化虚拟列表:

myApp.virtualList(listBlockContainer, parameters)

该方法包含以下参数:

  • listBlockContainer - 它是列表块容器的必需 HTML 或字符串元素。

  • parameters - 它是必需的对象,其中包含虚拟列表参数。

虚拟列表参数

下表提供了虚拟参数列表:

序号 参数及描述 类型 默认值
1

items

提供数组项列表。

数组 -
2

rowsBefore

它定义了在滚动屏幕位置之前要显示的行数。

数字 -
3

rowsAfter

它定义了在滚动屏幕位置之后要显示的行数。

数字 -
4

cols

它指定每行的项目数。

数字 1
5

height

此参数以 px 为单位返回项目高度。

数字或函数 (item) 44
6

template

它表示单个项目。

字符串或函数 -
7

renderItem

它使用自定义函数来显示项目 HTML。

函数 (index, item) -
8

dynamicHeightBufferSize

它在虚拟列表以及动态高度上指定缓冲区大小。

数字 1
9

cache

您可以启用或禁用项目列表的 DOM 缓存。

布尔值 true
10

updatableScroll

当您滚动页面时,它会更新设备并操作滚动事件。

布尔值 -
11

showFilteredItemsOnly

它使用 filter() 方法显示过滤后的项目。

布尔值 false
12

searchByItem

它用于使用搜索栏搜索项目,并使用搜索查询、项目索引和项目本身作为参数。

函数 (query, index, item) -
13

searchAll

它用于使用搜索栏搜索所有项目,并使用搜索查询和项目数组作为参数。

函数 (query, items) -
14

onItemBeforeInsert

在将项目插入虚拟文档片段之前执行回调函数。

函数 (list, item)
15

onBeforeClear

在删除 DOM 列表并替换为新文档片段之前执行回调函数。

函数 (list, item)
16

onItemsBeforeInsert

在删除 DOM 列表并在插入新文档片段之前执行回调函数。

函数 (list, item)
17

onItemsAfterInsert

在使用新文档片段插入项目后执行回调函数。

函数 (list, item)

虚拟列表属性

序号 属性及描述
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

如果为真,则显示所有指定项目中的最后一项。

虚拟列表方法

序号 方法及描述
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', {
   //List of array items
   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', {
   //List of array items
   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', {
   //List of array items
   items: [
      {
         name: 'Element 1',
         image: '/path/image1.jpg'
      },
      {
         name: 'Element 2',
         image: '/path/image2.jpg'
      },
      // ...
      {
         name: 'Element 50',
         image: '/path/image50.jpg'
      },
   ],
   
   //Here you can searches all items in array and send back array with matched items
   searchAll: function (query, items) {
      var myItems = [];
      
         for (var i = 0; i < items.length; i++) {
            // Here check if name contains query string
            if (items[i].name.indexOf(query.trim()) >= 0) myItems.push(i);
         }
         
         // Returns array with indexes of matched items
         return myItems;
   }
});

使用searchByItem 参数:

var myVal = myApp.virtualList('.list-block.virtual-list', {
   //List of array items
   items: [
      {
         name: 'Element 1',
         image: '/path/image1.jpg'
      },
      {
         name: 'Element 2',
         image: '/path/image2.jpg'
      },
      // ...
      {
         name: 'Element 50',
         image: '/path/image50.jpg'
      },
   ],
   
   //Here you can searches all items in array and send back array with matched items
   searchByItem: function (query, index, items) {
      // Here check if name contains query string
         if (items[i].name.indexOf(query.trim()) >= 0){
            return true;
         }  else {
            return false;
         }
      }
   }
});

动态高度

您可以使用height 参数代替数字来为项目使用动态高度。

var myVal = myApp.virtualList('.list-block.virtual-list', {
   //List of array items
   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; //display the image with 100px height
      else return 50; //display the image with 50px height
   }
});

API 方法

您可以使用 API 方法添加、删除、替换或移动虚拟列表项目。

//Here you can initialize the list
var myVal = myApp.virtualList('.list-block.virtual-list', {
   //List of array items
   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: '...',
});

//Here append your item
myVal.appendItem({
    image: 'Element 55'
});

// You can append multiple items when clicking on button
$('.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'
      }
   ]);
});

//replace the first item
myList.replaceItem(0, {
   name: 'Element 4'
});

//you can display first 10 items when clicking on button
$('.button.show-first-10').on('click', function () {
   //Passing array with indexes to show items
   myList.filter([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
});

//Reset the filter
$('.button.reset-filter').on('click', function () {
   myList.resetFilter();
});

//You can insert the item before 4th and 5th item
myList.insertItemBefore(1, {
   name: 'Element 4.5'
});
framework7_list_views.htm
广告