vue3实现虚拟列表

vue3.0发布了,刚好学习一下,仿照网上案例写了一个虚拟列表

<template>
    <div class='virtual' @scroll="scroll" :style="{height:400+'px'}">
        {{itemHeight}}
        <div class="list" :style="{height:dataLengh*itemHeight+'px'}">
            <ul :style="{'margin-top':`${scrollTop}px`}">
                <li v-for="(item,index) in visiablelist"
                :key="index"
                :style="{height:itemHeight+'px'}"
                >
                    {{item}}
                </li>
            </ul>
        </div>
    </div>
</template>
<script>
import {reactive,toRefs,computed} from 'vue'
export default {
    setup(prop,context){
    const dataLengh=100;
    const itemHeight=40;
     const data=reactive({
            scrollTop:0,
            startIndex:0,     
            endIndex:10,
           
    })
    function scroll(e){
            const scrollTop=e.target.scrollTop;
            data.scrollTop=e.target.scrollTop
            data.startIndex=Math.floor(scrollTop/itemHeight)
            data.endIndex=data.startIndex+10
        }
    const list=new Array(dataLengh)
    for(var i=0;i<list.length;i++){
        list[i]='这是第'+i+'段文本'
    }
    const visiablelist=computed(()=>{      
        return list.slice(data.startIndex,data.endIndex)})
        return {...toRefs(data),
                scroll,
                visiablelist,
                dataLengh,
                dataLengh,
                itemHeight
                }
    },
    
}
</script>
<style scoped>
.virtual{ border: solid 1px #eee;
  margin-top: 10px;
  height :400px;
  overflow :auto;}
.list{overflow: hidden;}
ul{  background: #ccc;
  list-style: none;
  padding: 0;
  margin: 0;}
li{ outline: solid 1px #fff;}
</style>

 

Vue3 和 TypeScript 结合使用虚拟列表Virtual Scrolling)可以提高大量数据的性能,尤其是在滚动时只渲染当前可见区域的数据。以下是一个简单的步骤概述: 1. **安装依赖**: 首先,安装 `vue-virtual-scroller` 或者自定义的 TypeScript 支持库,例如 `@vueuse/core` 的 `virtualList` 插件: ```bash npm install vue-virtual-scroller @vueuse/core ``` 2. **引入并配置**: 在 Vue 组件中导入虚拟滚动组件,并设置一些基本属性,如高度、滚动事件监听等: ```typescript import { defineComponent, ref } from &#39;vue&#39;; import { useVirtualList } from &#39;@vueuse/core&#39;; export default defineComponent({ setup() { const items = ref([]); // 你的数据源 const.virtualList = useVirtualList({ itemHeight: 50, // 每个项的高度,单位px containerHeight: window.innerHeight - 100, // 视图容器的高度减去一些边距 itemKey: (item) => item.id, // 数据项唯一标识 renderItem({ index, height }) { return <div key={index} style={{ height }}>{items[index]}</div>; }, onRendered({ start, end }) { console.log(`Rendered items ${start}-${end}`); } }); return () => ( <div ref={virtualList.containerRef}> {/* 渲染滚动区域 */} </div> ); } }); ``` 3. **处理数据更新**: 当数据源(`items`)变化时,需要通知虚拟列表更新其渲染区域: ```typescript items.value.length > 100 && items.value.splice(100); virtualList.scrollToBottom(); ``` 4. **调整样式和优化**: 可能还需要调整滚动条样式、添加分页或懒加载功能,以及处理滚动事件和滚动到顶部/底部等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值