快速实现虚拟列表

前言

虚拟列表(Virtual List)主要用于解决 大数据量列表渲染的性能问题,核心原理是只渲染可视区域内的元素,而非一次性渲染整个长列表,从而大幅减少 DOM 节点数量,提升性能。

使用场景:超长列表渲染、移动端应用、实时数据更新的高频场景、拖拽排序、动态高度等。

一、vue

vue3实现(vue-virtual-scroller@next)

安装 npm i vue-virtual-scroller@next

在main中引入

	import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
	import VueVirtualScroller from 'vue-virtual-scroller'; 
	app.use(VueVirtualScroller);

使用

<template>
    <div class="box">
        <RecycleScroller
            :items="bigArray" 
            :prerender="10"
            :buffer="32"
            :item-size="32"
            key-field="id"
            item-class="item">
            <template v-slot="{ item }">
                <div class="item">
                    {{ item.data }}
                </div>
            </template>
        </RecycleScroller>
    </div> 
</template>

<script setup>
import { ref } from 'vue' 
const bigArray = ref(
    Array.from({ length: 10000 }, (_, i) => ({
        id: i + 1,
        data: `Item ${i + 1}`
    }))
)
</script>
</script>

效果
请添加图片描述

具体项配置可参考官网vue-virtual-scroller

vue3实现(useVirtualList)

安装 npm i @vueuse/core

使用

import { useVirtualList } from '@vueuse/core'

const { list, containerProps, wrapperProps } = useVirtualList(
  Array.from(Array.from({ length: 99999 }).keys()),
  {
    // Keep `itemHeight` in sync with the item's row.
    itemHeight: 22,
  },
)

配置

状态类型描述
itemHeightnumber确保正确计算 wrapper 元素的总高度
itemWidthnumber确保正确计算 wrapper 元素的总宽度
overscannumber预渲染 DOM 节点的数量。如果滚动速度非常快,可以防止项目之间出现空白
  • itemHeightitemWidth 必须与渲染的每行的高度保持同步。如果你在滚动到列表底部时看到额外的空白或抖动,请确保 itemHeight 或 itemWidth 与行的高度相同。

官网useVirtualList

二、react实现(react-window)

安装:npm install react-window

使用

import { VariableSizeList as List } from 'react-window';

const Row = ({ index, style }) => <div style={style}>Item {index + 1}</div>;

const VirtualList = () => (
	<List height={500} itemCount={1000} itemSize={() => 50} width={300}>
		{Row}
	</List>
);

export default VirtualList;

效果
请添加图片描述
具体项配置可参考react-window

### 在项目中使用 Composition API 封装公共逻辑的方法 使用 Composition API 封装公共逻辑,主要是将相关的逻辑提取到一个独立的函数(通常称为自定义 Hook)中,以实现逻辑复用和提高代码的可维护性。以下是封装公共逻辑的一般方法: 1. **确定逻辑边界**:明确要封装的逻辑,例如处理表单验证、数据获取、事件监听等。 2. **创建自定义 Hook**:将逻辑封装在一个函数中,该函数可以接收参数并返回需要的数据或方法。 3. **使用自定义 Hook**:在组件中引入并调用自定义 Hook,获取其返回值并在组件中使用。 ### useVirtualList 封装示例 `useVirtualList` 是一个用于实现虚拟列表的自定义 Hook,虚拟列表可以在处理大量数据时提高性能,只渲染可见区域的列表项。以下是一个简单的 `useVirtualList` 示例: ```vue <template> <div style="height: 300px; overflow: auto" @scroll="onScroll"> <div :style="{ height: totalHeight + &#39;px&#39; }"> <div v-for="(item, index) in visibleItems" :key="index" :style="{ transform: `translateY(${index * itemHeight}px)` }" > {{ item }} </div> </div> </div> </template> <script setup> import { ref, computed, onMounted } from &#39;vue&#39;; const useVirtualList = (list, itemHeight, containerHeight) => { const scrollTop = ref(0); const startIndex = computed(() => Math.floor(scrollTop.value / itemHeight)); const endIndex = computed(() => startIndex.value + Math.ceil(containerHeight / itemHeight)); const visibleItems = computed(() => list.slice(startIndex.value, endIndex.value)); const totalHeight = computed(() => list.length * itemHeight); const onScroll = (e) => { scrollTop.value = e.target.scrollTop; }; return { visibleItems, totalHeight, onScroll }; }; // 模拟数据 const list = Array.from({ length: 1000 }, (_, index) => `Item ${index}`); const itemHeight = 30; const containerHeight = 300; const { visibleItems, totalHeight, onScroll } = useVirtualList(list, itemHeight, containerHeight); </script> ``` 在上述示例中,`useVirtualList` 函数接收三个参数:`list` 是要渲染的列表数据,`itemHeight` 是每个列表项的高度,`containerHeight` 是列表容器的高度。该函数返回 `visibleItems`、`totalHeight` 和 `onScroll`,分别表示可见的列表项、列表的总高度和滚动事件处理函数。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jet_closer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值