虚拟滚动列表组件ReVirtualList

news2024/11/28 4:38:45

虚拟滚动列表组件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支持配置函数动态获取高度,如果您需要动态高度可以试着通过这个配置项实现

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

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

稳定、耐用、美观 一探究竟六角头螺钉螺栓如何选择

在机器与技术未被发现的过去&#xff0c;紧固件设计和品质并不稳定。但是&#xff0c;他们已成为当今许多行业无处不在的构成部分。六角头标准件或六角头标准件是紧固件中持续的头部设计之一&#xff0c;它有六个面&#xff0c;对广泛工业应用大有益处。六角头标准件或常分成六…

animatecss动画效果

1. 官网 https://animatecss.node.org.cn/ 2. 安装 npm install animate.css --save 使用时需要在vue中引入&#xff1a;import "animate.css;与内置组件配合使用&#xff1a; <Transition>Vue官网链接如果按照animatecss官网的用法,则只能指定进入或退出其中一…

L2G: A Simple Local-to-Global Knowledge Transfer Framework for WSSS

摘要 挖掘精确的类感知注意图&#xff0c;即类激活图&#xff0c;是弱监督语义分割的关键。在本文中&#xff0c;我们提出了L2G&#xff0c;一个用于高质量对象注意力挖掘的简单的在线局部到全局知识转移框架。我们观察到&#xff0c;当用局部补丁替换输入图像时&#xff0c;分…

汽车的UDS诊断02

UDS的不同服务: 1)物理寻址和功能寻址 can总线上往往有多个ECU,诊断设备可以和某个ECU通信,也可以和多个ECU通信,通过物理寻址和功能寻址来解决这个问题,只针对请求报文: 物理寻址:就是诊断仪与ECU之间点对点通信 功能寻址:就是诊断仪与多个ECU之间一对多信 我们的…

数字货币发行项目开发基本要求及模式创建与海外宣发策略

随着区块链技术的迅速发展和应用普及&#xff0c;数字货币项目&#xff08;Cryptocurrency Projects&#xff09;成为了全球金融创新的重要领域。无论是中心化的数字货币&#xff08;如稳定币&#xff09;还是去中心化的加密货币&#xff0c;都在重塑金融市场的格局。然而&…

halcon二维码识别

read_image (Image, C:/Users/Administrator/Desktop/二维码测试/1.bmp) rgb1_to_gray (Image, GrayImage) *创建一个二维码数据class模型create_data_code_2d_model (Data Matrix ECC 200,[], [],DataCodeHandle) *-检测和读取图像中的二维数据代码符号或训练二维数据代码模…

【C++笔记】引用和const引用以及inline和nullptr

【C笔记】引用和const引用以及inline和nullptr &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】引用和const引用以及inline和nullptr前言一.引用1.1引用的概念和定义1.2引用的特性1.3引用的使用 二. const引用三.指…

自动微分autograd实践要点

目录 定义Value手动定义每个 operator 的 _backward() 函数构建反向传播计算链 本文主要参考 反向传播和神经网络训练 大神Andrej Karpathy 的“神经网络从Zero到Hero 系列”之一&#xff0c;提炼一些精要&#xff0c;将反向传播的细节和要点展现出来 定义Value 第一步首先要…

基于BlockQueue的生产消费模型及Linux中的信号量

基于BlockQueue的生产消费模型 Task.hpp #pragma once#include<cstdio> #include<iostream> #include<string> #include<functional>using namespace std; class CalTask {using func_tfunction<int(int,int,char)>;//typedef function<int(…

OW-VISCap——开放世界视频实例分割方法研究

概述 论文地址&#xff1a;https://arxiv.org/pdf/2404.03657 本文提出了一种名为 OW-VISCap&#xff08;开放世界视频实例分割和字幕&#xff09;的方法。其三大贡献是 开放世界对象查询&#xff1a;除了已知对象查询外&#xff0c;还引入了开放世界对象查询&#xff0c;以发…

python爬虫521

爬虫521 记录 记录 最近想学爬虫&#xff0c;尝试爬取自己账号下的文章标题做个词云 csdn有反爬机制 原理我就不说啦 大家都写了 看到大家结果是加cookie 但是我加了还是521报错 尝试再加了referer 就成功了(╹▽╹) import matplotlib import requests from wordcloud impor…

第2章-03-HTTP协议,POST与GET等请求方式

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

揭秘移动IP:为何定位精度多停留在城市级?

随着电子信息技术的日新月异&#xff0c;移动网络已深度融入我们的日常生活&#xff0c;从2G的初步尝试到5G的飞跃&#xff0c;不仅数据传输速度实现了质的飞跃&#xff0c;更催生了丰富多样的移动应用场景与功能。在这一变革浪潮中&#xff0c;移动IP&#xff08;Mobile IP&am…

再见百度网盘,我有ZFile了!!【送源码】

项目简介 ZFile是一款强大的在线网盘管理系统&#xff0c;专为个人用户设计&#xff0c;能够将不同类型的存储资源统一在一个简洁易用的界面中进行管理和访问。通过ZFile&#xff0c;用户不再需要记住并登录多个云存储平台&#xff0c;所有的文件管理操作都可以在一个地方完成&…

Tomcat:Web 领域的闪耀明珠,魅力何在?

一、Web技术 HTTP 协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议。它的主要作用是在客户端和服务器之间传输超文本数据&#xff0c;如网页、图片、视频等。 HTTP 协议的特点 无状态性 HTTP 协议是…

【数学建模】优化模型——两辆平板车装货问题

问题描述 包装箱规格&#xff1a;共有七种规格的包装箱&#xff0c;每种包装箱的厚度&#xff08;t&#xff09;和重量&#xff08;w&#xff09;不同。表中列出了每种包装箱的厚度、重量及数量。 平板车限制&#xff1a; 每辆平板车的可用装载长度为10.2米&#xff08;1020厘…

《QT从基础到进阶·七十三》Qt+C++开发一个python编译器,能够编写,运行python程序

1、概述 源码放在文章末尾 该项目利用QtC实现了一个简易的python编译器&#xff0c;类似pycharm或vsCode这样的编译器&#xff0c;该python编译器支持如下功能&#xff1a; &#xff08;1&#xff09;支持编写python程序 &#xff08;2&#xff09;编写代码时有代码补全提示 &…

写给大数据开发:如何优化临时数据查询流程

你是否曾因为频繁的临时数据查询请求而感到烦恼&#xff1f;这些看似简单的任务是否正在蚕食你的宝贵时间&#xff0c;影响你的主要工作&#xff1f;如果是&#xff0c;那么这篇文章正是为你而写。 目录 引言&#xff1a;数据开发者的困境问题剖析&#xff1a;临时数据查询的…

MKS电源GMW-25RF Plasma Generator手侧

MKS电源GMW-25RF Plasma Generator手侧

C语言基础(八)

1、标准库函数&#xff1a; 测试代码1&#xff1a; #include <stdio.h> // 标准库函数头文件导入 // 自定义函数 int add(int a, int b) { return a b; } // 声明回调函数类型 typedef void (*Callback)(int); // 调用回调函数的函数 void process(Callb…