虚拟滚动列表组件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 | number | 400 |
skeleton | 是否显示骨架屏 | boolean | true |
rowHeight | 列表项高度,建议根据实际渲染指定 | number | - |
type | 列表类型 | “card” | “list” | “list” |
grid | 响应网格,仅在type="card"下有效 | number | ReGridResponsive | 1 |
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 | 预加载数量,默认同pageSize | MaybeRef<number> | - |
多列参数,作为虚拟滚动计算参数,VirtualList会自动响应列表的网格数量,不需要手动配置 | MaybeRef<number> | 1 | |
debounce | 滚动事件时延 | number | 300 |
ReVirtualList事件
事件名 | 说明 | 格式 |
---|---|---|
update:checks | 已选中列表发生变化时触发 | (checks: Array<string | number>) => void |
check | 点击某个复选框时触发 | (checked: boolean, id: string | number, item: Record<string, any>) => void |
ReVirtualList插槽
插槽名 | 说明 |
---|---|
default | 列表项作用域插槽,带有 item、metas 两个作用域变量 |
title | List页头标题插槽 |
extra | List页头额外信息插槽 |
footer | PageList页脚插槽,在分页器之前 |
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支持配置函数动态获取高度,如果您需要动态高度可以试着通过这个配置项实现
如果觉得对您有帮助的话,可以请小编瑞一下
相关文章:
虚拟滚动列表组件ReVirtualList
虚拟滚动列表组件ReVirtualList 组件实现基于 Vue3 Element Plus Typescript,同时引用 vueUse lodash-es tailwindCss (不影响功能,可忽略) 在 ReList 的基础上,增加虚拟列表功能,在固定高度的基础上,可以优化大数…...
稳定、耐用、美观 一探究竟六角头螺钉螺栓如何选择
在机器与技术未被发现的过去,紧固件设计和品质并不稳定。但是,他们已成为当今许多行业无处不在的构成部分。六角头标准件或六角头标准件是紧固件中持续的头部设计之一,它有六个面,对广泛工业应用大有益处。六角头标准件或常分成六…...
数据库Mybatis基础操作
目录 基础操作 删除 预编译SQL 增、改、查 自动封装 基础操作 环境准备 删除 根据主键动态删除数据:使用了mybatis中的参数占位符#{ },里面是传进去的参数。 单元测试: 另外,这个方法是有返回值的,返回这次操作…...
人物形象设计:塑造独特角色的指南
引言 人物形象设计是一种创意过程,它利用强大的设计工具,通过视觉和叙述元素塑造角色的外在特征和内在性格。这种设计不仅赋予角色以生命,还帮助观众或读者在心理层面上与角色建立联系。人物形象设计的重要性在于它能够增强故事的吸引力和说…...
网络安全-安全策略初认识
文章目录 前言理论介绍1. 安全策略1.1 定义:1.2 关键术语: 2. 防火墙状态监测 实战步骤1:实验环境搭建步骤2:配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who:本文主要写给入门防火墙的技…...
python import相对导入与绝对导入
文章目录 相对导入与绝对导入绝对导入相对导入何时使用相对导入何时使用绝对导入示例 相对导入与绝对导入 在Python中,from .file_manager import SomeFunction 和 from file_manager import SomeFunction 两种导入方式看似相似,但在模块寻找机制上存在…...
深入理解 Go 语言原子内存操作
原子内存操作提供了实现其他同步原语所需的低级基础。一般来说,你可以用互斥体和通道替换并发算法的所有原子操作。然而,它们是有趣且有时令人困惑的结构,应该深入了解它们是如何工作的。如果你能够谨慎地使用它们,那么它们完全可以成为代码优化的好工具,而不会增加复杂性…...
PostgreSQL几个扩展可以帮助实现数据的分词和快速查询
在 PostgreSQL 数据库中,有几个扩展可以帮助实现数据的分词和快速查询,特别是在处理全文搜索和文本分析时。以下是几个常用的扩展: 1. pg_trgm pg_trgm(Trigram)扩展是 PostgreSQL 中的一个强大的工具,它可以通过计算字符串之间的相似度来实现快速文本搜索。它支持基于…...
C盘满了怎么办?教你清理C盘的20个大招,值得收藏备用
C盘满了怎么办?教你清理C盘的20个大招,值得收藏备用 今天给大家介绍20种C盘清理的方法,下次遇到C盘满了红了就知道怎么做了,喜欢请点赞收藏关注点评。 清理更新缓存 清理微信缓存 查找大文件清理或者迁移 磁盘缓存清理 系统还…...
原生js实现下滑到当前模块进度条填充
<div style"height: 1500px;"></div> <div class"progress-container"><div class"progress-bar" data-progress"90%"><p class"progress-text">Google Ads在Google搜索引擎上覆盖超过90%的互…...
显示弹出式窗口的方法
文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了Sliver综合示例相关的内容,本章回中将介绍PopupMenuButton组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧…...
Java-什么是缓存线程池?
什么是缓存线程池? 缓存线程池 (CachedThreadPool) 是一种特殊的线程池,它能够动态地调整线程的数量,以适应任 务的需求。这种线程池非常适合处理大量短暂的任务,因为它会根据任务的数量自动增加或减少线 程的数量。 缓存线程池的特点: 线程数量动态调整:缓存线程池…...
esbuild中的Binary Loader:处理二进制文件
在前端或Node.js项目中,有时需要处理二进制文件,如图片、音频、视频或其他非文本资源。esbuild提供了一款名为Binary Loader的插件,它能够在构建时将二进制文件加载为二进制缓冲区,并使用Base64编码将其嵌入到打包文件中。在运行时…...
深度好文:从《黑神话:悟空》看未来游戏趋势:高互动性、个性化与全球化
引言 在数字时代的浪潮中,游戏产业以其独特的魅力和无限的可能性,成为了全球娱乐文化的重要组成部分。随着科技的飞速发展,特别是高性能计算和人工智能技术的突破,游戏的世界变得越来越真实、细腻且富有深度。而在这股技术洪流中…...
【中项第三版】系统集成项目管理工程师 | 第 12 章 执行过程组
前言 本章属于10大管理的内容,上午题预计会考8-10分,下午案例分析也会进行考查。学习要以教材为主。 目录 12.1 指导与管理项目工作 12.1.1 主要输入 12.1.2 主要输出 12.2 管理项目知识 12.2.1 主要输入 12.2.2 主要输出 12.3 管理质量 12.3.…...
C语言自动生成宏定义枚举类型和字符串
#include <stdio.h>// 定义错误枚举 #define ERROR_LIST(e) \e(SUCCESS) \e(FAILURE) \e(NOT_FOUND) \e(TIMEOUT)// 使用宏生成枚举 #define GENERATE_ENUM(ENUM) ENUM, typedef enum {ERROR_LIST(GENERATE_ENUM) } ErrorCode;// 使用宏生成字符串数组…...
C#单例模式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _3._3._6_单例模式 {public class Singleton{private static Singleton s_instance;private int _state;private Singleton(int …...
10-使用sentinel流控
本文介绍sentinel的直接流控的使用。 0、环境 jdk 1.8sentinel 1.8.2springboot 2.4.2 1、sentinel环境搭建 从官方发布的网站上下载: sentinel Jar,下载对应版本。 下载完成后,进入刚才下载的Jar文件所在的目录,执行如下命令:…...
redis AOF机制
在redis运行期间,不断将redis执行的写命令写到文件中,redis重启之后,只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中,因此其执行效率高于RDB,开启AOF即使Redis发生故障࿰…...
Day 21代码|随想录| 二叉树完结撒花,今日刷题669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.吧二叉搜索树转换为累加树
提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 二叉树 Part06二、题目题目一:669.修剪二叉搜索树解题思路:递归法迭代法: 题目二: 108.将有序数组转换为二叉搜索树解题思路递归法:迭代…...
cmake教程一
1. Start 1.1 构建简单工程 cmake_minimum_required(VERSION 3.0) project(Step1) add_executable(Step1 main.cpp)设置cmake最低版本要求设置工程名字设置工程生成可执行程序 2. 声明 C Standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)如果我…...
3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)
如果你想用HTML元素作为标签标注三维场景中模型信息,需要考虑定位的问题。比如一个模型,在代码中你可以知道它的局部坐标或世界坐标xyz,但是你并不知道渲染后在canvas画布上位置,距离web页面顶部top和左侧的像素px值。自己写代码把…...
C++参悟-单例模式
单例模式 一、概述1. 特点2. 实现方式3. 应用场景 二、实现代码1. 静态局部变量的懒汉单例2. 加锁的懒汉式单例3. 使用 C11 中的 std::call_one 的懒汉单例4. 饿汉式单例 一、概述 这里记录一下单例模式的最常用使用,单例模式(Single Pattern࿰…...
【题解】—— LeetCode一周小结32
🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接:600. 不含连续…...
详解线索分层的目的、维度与创新实践
线索分层是一个系统性的过程,旨在更有效地管理、跟踪和利用线索资源。这一过程可以借鉴多种策略和方法,特别是在用户运营和市场营销中。 1、线索分层的目的 线索分层的主要目的是根据线索的不同特征或成熟度,将其分类管理,以便更…...
于8月21号的回顾
傍晚的日落和逐渐深邃的夜,驱散了白天的极致闷热。倦怠和疲惫充斥着大脑,喧嚣的浮沉又在耳边轰鸣。 我不曾想到,再次打开博客已经是两年后的今天了。手指轻轻滑过鼠标,博客的页面缓缓加载,那些被时间尘封的记忆瞬间涌…...
Abstract Class抽象类
抽象类(Abstract Class)在面向对象编程中是一种特殊的类,它不能被实例化,即不能创建该类的对象。抽象类主要用于定义一组接口(即方法),这些方法的具体实现由子类来完成。抽象类通常用于表示一种…...
webrtc ns 降噪之粉红噪声参数推导
webrtc中降噪中,前50帧需要进行简单噪声估计,使用白噪声和粉红噪声模型估算。 首先我们 复习 有色噪声(包含白噪声)的一般模型: S(f) 是频率 f 处的功率谱密度。f是频率。α 是一个频谱指数,通常在1左右。…...
IO进程线程8月21日
1,思维导图 2,登录 #ifndef __LOG_H__ #define __LOG_H__ #include<myhead.h> typedef struct {char name[20];char pwd[20]; }str;int regist();int login(); #endif#include"log.h" int login() {char a[20]"\n";str p,s;…...
Web安全:SqlMap工具
一、简介 sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统…...
网站404页面源码/seo 重庆
1. 安装yum install asciinema 2. 使用录制 asciinema rec filename(可选,方便进行后期的回放play)同时生成一个url 地址方便传递https://asciinema.org/a/xxxxxxx同时绑定账户之后,可以存储历史的信息 asciinema play filename 3. 参考地址https://a…...
制作 网站/百度快照优化排名推广怎么做
access总结 在access数据库管理系统中,数据库是一个基础,它主要用来存储数据库应用系统中的其他数据库对象,也就是说,构成数据库应用系统的其他对象都存储在数据库中。 access第二章书中介绍使用access创建数据库的各种方法以及数…...
郑州优化网站 优帮云/信息流优化师需要具备哪些能力
文章目录一、进程的创建二、文件描述符三、管道及重定向一、进程的创建 教程地址 Linux 系统调用 system()函数详解 mysys.c: 实现函数mysys,用于执行一个系统命令,要求如下 mysys的功能与系统函数system相同,要求用…...
政府网站后台/长沙网站制作推广
编辑插件 sublime自带的markdown语法高亮并不是很友好,推荐安装Markdown Editing,github主页然后在视图->语法里选择MarkdownEditing启用,支持三种风格,分别是Standard Markdown, GitHub flavored Markdown, MultiMarkdown. 在首选项->Package Setting->Markdown Edi…...
wordpress 迅搜/百度推广怎么才能效果好
Python之路【第四篇】:模块 模块,用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来…...
高端网站建设的公司/重庆seo整站优化设置
移动端开发难免拿到输入框居中或者位于底部的情况,ios 端,软键盘能够按正常预期向上滑动(这里有个问题,当 input 聚焦时,弹出软键盘,input 上滑,此时屏幕是具有滚动效果的,还没找到合…...