虚拟滚动列表组件ReVirtualList

虚拟滚动列表组件ReVirtualList

组件实现基于 Vue3 + Element Plus + Typescript,同时引用 vueUse + lodash-es + tailwindCss (不影响功能,可忽略)

ReList 的基础上,增加虚拟列表功能,在固定高度的基础上,可以优化大数据列表展示

思路

滚动容器默认使用List列表的父节点,需要配置 height 设置List的高度用于展示滚动条。

如果滚动容器不想使用List的父节点,可以通过 scrollTarget 指定,但是 height 需要设置为 auto,避免List内置滚动。

通过自己封装的虚拟滚动计算hook,通过监听滚动容器的滚动行为,根据当前展示视图的滚动距离计算展示内容在列表数据中的数据索引,从而获得展示视图对于数据的索引范围,以及前置内容高度,后置内容高度,最后将前置内容高度,后置内容高度以padding的方式设置,保证滚动容器的高度始终一致。

为了优化滚动交互,增加前置预加载数量和后置预加载数量,最终得到的渲染数据的数据索引。

对于卡片布局,可能存在网格布局(多列),还需要在虚拟滚动计算时,加入网格列数参数进行计算,得到最终的一个渲染数据索引范围。

难点

  • 考虑网格布局时加入列数进行虚拟滚动计算

基础

通过 items 绑定全量数据,自动进行虚拟滚动计算渲染。虚拟滚动需要指定列表项固定高度,使用前可以通过实际渲染高度或UI设计稿高度定义,默认列表项会直接使用固定高度渲染,内容超出会被隐藏。

在这里插入图片描述

查看 /demo/list/virtual.md

卡片列表

支持网格卡片列表的虚拟滚动展示,会自动根据网格数量进行虚拟滚动计算,得到能够占满当前滚动视图的网格数量。

在这里插入图片描述

查看 /demo/list/virtual-card.md

ReVirtualList属性

字段说明类型默认值
items必填,列表项数据集Record<string, any>[]-
metas必填,列表项展示配置ReListItemMetas-
title列表标题string-
height列表高度,不包括页头和页脚,默认按像素值处理string | number400
skeleton是否显示骨架屏booleantrue
rowHeight列表项高度,建议根据实际渲染指定number-
type列表类型“card” | “list”“list”
grid响应网格,仅在type="card"下有效number | ReGridResponsive1
gutter网格间距,仅在type="card"下有效number | [number] | [number, number]16

除了上述属性,支持ReList所有属性,默认会被ReList实例继承

同时ReVirtualList属性也继承了CustomVirtualScrollProps属性

CustomVirtualScrollProps

字段说明类型默认值
scrollTarget必填,滚动容器HTMLElement | (() => HTMLElement)-
pageSize页大小MaybeRef<number>20
rowHeight列表项高度number | ((index: number) => number)-
previewRows预加载数量,默认同pageSizeMaybeRef<number>-
cols多列参数,作为虚拟滚动计算参数,VirtualList会自动响应列表的网格数量,不需要手动配置MaybeRef<number>1
debounce滚动事件时延number300

ReVirtualList事件

事件名说明格式
update:checks已选中列表发生变化时触发(checks: Array<string | number>) => void
check点击某个复选框时触发(checked: boolean, id: string | number, item: Record<string, any>) => void

ReVirtualList插槽

插槽名说明
default列表项作用域插槽,带有 item、metas 两个作用域变量
titleList页头标题插槽
extraList页头额外信息插槽
footerPageList页脚插槽,在分页器之前

ReVirtualList Expose

字段说明类型
scrollTop当前滚动位置离容器顶部距离number
startPadding前置占位高度number
endPadding后置占位高度number
startIndex渲染数据开始索引number
endIndex渲染数据结束索引Ref<number>
scrollTo滚动到指定距离(scrollTop: number) => void
scrollToIndex滚动到指定索引位置(index: number) => void

源代码

Github

可以通过查看具体实现,如果遇到问题可以留言或者提出issue。

hook

虚拟滚动的实现单独抽离了一个hook,自行查看 hook/useVirtualScroll 方法,可以利用这个hook实现自己的虚拟滚动行为。目前还是基于固定高度进行计算,提供了一个rowHeight支持配置函数动态获取高度,如果您需要动态高度可以试着通过这个配置项实现

如果觉得对您有帮助的话,可以请小编瑞一下

在这里插入图片描述

在这里插入图片描述

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iWangsd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值