vue3 虚拟滚动的一些实践
看到这个vueuse库打开新天地后,看到一句warning: Consider using vue-virtual-scroller
instead, if you are looking for more features.
于是用起来。
好用,前提是看懂文档
业务需要使用grid,它的grid竟然不是css,而是js计算
// tempalte <template> <RecycleScroller :ref="(el) => setItemRef(el, tab.name)" // 需要绑到外部的div上,否则访问是instance class="test-scroller" // css必须定义高度 :items="items" keyField="id" v-bind="{ ...scrollConfig }" itemClass="recycle-scroll-item" @resize="handleScrollResize(tab.name)" <template v-slot="{ item:}"> // xxx组件 </template> </RecycleScroller> </template> <script> const RecycleScrollerRefMap = {}; const setItemRef = (el, key) => { if (el) { RecycleScrollerRefMap[key] = el; } }; const scrollConfig = { itemSize: 360, // 高 minItemSize: 360, // 高 itemSecondarySize: 408, // 宽 gridItems: 4, }; const handleScrollResize = (key) => { console.log('*******', RecycleScrollerRefMap[key]); // 打印出来竟然是 VueInstance // 适配兼容windowWidth if (!dbfn) { dbfn = debounce((domWidth) => { const windowWidth = window.innerWidth; const contentDomWidth = domWidth; let screenCode = 'xl'; if (windowWidth >= 1920) { screenCode = 'xl'; } else if (windowWidth >= 1200) { screenCode = 'lg'; } else if (windowWidth >= 992) { screenCode = 'md'; } else if (windowWidth >= 768) { screenCode = 'sm'; } const padding = 8; scrollConfig.gridItems = gridItemMap[screenCode]; const calWidth = Math.floor( (1 / gridItemMap[screenCode]) * contentDomWidth - padding, ); const maxWidth = gridItemMaxWidthMap[screenCode]; scrollConfig.itemSecondarySize = (maxWidth && (calWidth > maxWidth ? maxWidth : calWidth)) || calWidth; }, 500); } dbfn(RecycleScrollerRefMap[key].clientWidth); }; </script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现