Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用

分享个人写的一个基于 Vue3 的虚拟列表组件库,欢迎各位来进行使用与给予一些更好的建议😊

概述:该组件组件库用于提供虚拟化列表能力的组件,用于解决展示大量数据渲染时首屏渲染缓慢和滚动卡顿问题

功能:该组件库主要包含 HFixedHeightVirtualList 与 HFlexibleHeightVirtualList 两个组件

  • HFixedHeightVirtualList: - 定高虚拟列表组件,用于列表中每一项 item 的高度都是固定时
  • HFlexibleHeightVirtualList: - 不定高虚拟列表组件,用于列表中的每一项 item 都可能是不一样时

安装: npm i virtual-list-vue3

使用:🔺通过 item 具名插槽插槽,插入对应的 HTML 结构,该插槽也接收一个 { itemData } 属性(itemData 为该项 item 的数据)

使用示例

定高虚拟列表示例: - HFixedHeightVirtualList

html 复制代码
<script setup lang="ts">
import { HFixedHeightVirtualList } from 'virtual-list-vue3';

const list = Array.from({ length: 1000 }, (_, i) => i + 1) // -- 1.模拟长列表数据(生产一个长度为1000的数组)
</script>

<template>
    <!-- 2.传入对应的 list 数据,与对应 item 的定高高度 -->
    <HFxiedHeightVirtualList :list="list" :item-height="40">
        <!-- 3.通过 item 具名插槽传入对应的 item 的 HTML 结构,该插槽会返回该项的 itemData 数据  -->
        <template #item="{ itemData }">
            <div class="item">{{ itemData }}</div>
        </template>
    </HFxiedHeightVirtualList>
</template>

<style scoped>
/* 4.基本样式,.item 的高度需要与上面传入的 item-height 配置的一样 */
.item {
    height: 40px; /* 定高 */
    background-color: orange;
    color: white;
    line-height: 40px;
    text-align: center;
    margin-bottom: 8px;
}
</style>

不定高虚拟列表示例: - HFlexibleHeightVirtualList

html 复制代码
<script setup lang="ts">
import { HFlexibleHeightVirtualList } from 'virtual-list-vue3';
    
// -- 1.模拟长列表数据(生产一个长度为1000的,且值为不定数量的文字,为了模拟不定高的情况)
const list = Array.from({ length: 1000 }, (_, i) => {
    let item = "小"
    if(i === 999) item = "END:"
    for(let i = 0; Math.floor(Math.random() * 200); i++) {
        item += "孔" // -- tip:注意这里不能使用英文来进行模拟,因为html的截断规则是根据单词来的,所以就会导致不会换行(了解)
    }
    return item
}) 

</script>

<template>
    <!-- 2. 传入对应的列表数据 -->
    <HFlexibleHeightVirtualList :list="list">
        <!-- 3.通过 item 具名插槽传入对应的 item 的 HTML 结构,该插槽会返回该项的 itemData 数据  -->
        <template #item="{ itemData }">
            <div class="item" >{{ itemData }}</div>
        </template>
    </HFlexibleHeightVirtualList>
</template>

<style scoped>
/* 4.基本样式: 不定高,根据内容适应高度 */
.item {
    background-color: orange;
    color: white;
    margin-bottom: 8px;
}
</style>

Props

属性名 说明 类型 默认值 是否必传 tip
list 列表数据 any[] - 是
width 容器的宽度 number` / `string "100%" 否 当为 number 时以 px 为单位,当为 string 时,则会直接赋值到容器上
height 容器的高度 number / string "100vh" 否 当为 number 时以 px 为单位,当为 string 时,则会直接赋值到容器上
bufferCount 视区上、下额外展示的 DOM 节点数量(预加载) number 6 否 -
hiddenScrollbar 是否隐藏滚动条 boolean false 否 -
reachBottomFn 触底回调函数 () => void / null null 否 -
reachBottomFnDistance 滚动到底部触发触底回调的触发距离(距离底部的距离) number 50 否 以 px 为单位
triggerBottomFnTime 触发触底执行函数的节流时间 number 400 否 以 ms 为单位

定高列表特有 Props

属性名 说明 类型 默认值 是否必传 tip
itemHeight 列表每一项 item 的高度 number - 是 以 px 为单位

不定高列表特有 Props

属性名 说明 类型 默认值 是否必传 tip
initItemHeight 列表 item 的预计高度 number 40 否 预计高度,尽量要小点,可以多加载,但不能少,防止渲染不全(但也不能太过小,如 3、10...)

Props API

ts 复制代码
interface VitualListProps<T> {
    list: T[],
    bufferCount?: number
    height?: number | string
    width?: number | string
    hiddenScrollbar?: boolean
    reachBottomFn?: (...props: any[]) => any | null
    reachBottomDistance?: number
    triggerBottomFnTime?: number
}

interface FixedHeightProps<T> extends VitualListProps<T> {
    itemHeight: number
}

interface FlexibleHeightProps<T> extends VitualListProps<T> { 
    initItemHeight?: number
}
相关推荐
扶风ff6 小时前
新品知识更新太快?用练题簿在线刷题,安排企业培训的小测与复盘
前端·学习·小程序
对空六课6 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
Csvn8 小时前
Vue3 响应式与编译:依赖收集如何升级为节点级靶向更新
前端
星栈9 小时前
pnpm 12 升级实测
前端·javascript
传奇开心果编程9 小时前
【SwiftUI提高练中学】第13课 实时活动与灵动岛:ActivityKit 实战
学习·ui·ios·swiftui·swift
欣欣之王来了9 小时前
Python入门:什么是Python以及为什么选择它
学习·架构·面向对象·项目·python教程
Sirens.9 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
Ai-_Man9 小时前
您您这可以把Microsofat Copilot的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑·copilot
dadaobusi9 小时前
pcie原子操作和nvme原子操作
学习
sunshine22 girl10 小时前
Java学习五 面向对象高级5 内部类1
java·学习