分享一个vue虚拟列表的组件: https://github.com/tangbc/vue-virtual-scroll-list 官方文档: https://tangbc.github.io/vue-virtual-scroll-list
在项目中,大数据渲染常常遇到,比如umy-ui(ux-table)虚拟列表table组件,vue-virtual-scroller以及react-virtualized 这些优秀的插件快速满足业务需要 为了理解插件背后的原理机制,我们实现一个自己简易版的虚拟列表,希望在实际业务项目中能带来一些思考和帮助。 正文开始... 虚拟列表是什么 在大数据渲染中,选择一段可视区域显示对应数据。 确定显示元素范围 3、确定每个元素的top,当向上滑动时,确定当前的位置与最后元素的位置索引,根据当前位置与最后元素位置,渲染可视区域 具体逻辑代码如下
2018的提出问题,2019年官方给出了解决方案recycle-view微信小程序长列表卡顿,但是这个只能解决部分问题,对于嵌套数据可能并不能适配。而且内部实现也是按虚拟列表渲染的思路去操作的。 flex; flex-direction: column; align-items: center; justify-content: center; } </style> 复制代码 方案 采用虚拟列表 ,参考云中桥-「前端进阶」高性能渲染十万条数据(虚拟列表)的方案。 根据上面对虚拟列表的描述,编写了一个简单的虚拟列表,代码如下。 <template>
这次我们来看看虚拟列表是什么玩意,并用 React 来实现两种虚拟列表组件。 虚拟列表,其实就是将一个原本需要全部列表项的渲染的长列表,改为只渲染可视区域内的列表项,但滚动效果还是要和渲染所有列表项的长列表一样。 虚拟列表的实现分两种,一种是列表项高度固定的情况,另一种是列表项高度动态的情况。 列表项高度固定 列表项高度固定的情况会简单很多,因为我们可以在渲染前就能知道任何一个列表项的位置。 虚拟列表组件通过 ref 提供了一个 resetHeight 方法来重置缓存的高度。 ,需要手动触发重置虚拟列表缓存的高度集合,建议宽度固定; 图片加载需要时间,尤其是图片多的情况下,会让一个列表项的高度不断变大,需要你手动触发重置虚拟列表高度。
Vue 虚拟列表是一种用于优化大型列表的渲染性能的技术。它通过只渲染可见部分的列表项,以及通过动态添加和删除DOM元素的方式来减少DOM操作,从而提高应用程序的响应速度和性能。 Vue 虚拟列表的实现依赖于一些关键技术,包括虚拟滚动、缓存池和动态渲染。 虚拟滚动是 Vue 虚拟列表的核心技术之一。它通过仅在屏幕上显示可见部分的列表项,而不是整个列表来减少渲染所需的时间和资源。 缓存池的实现涉及到维护一个包含渲染过的列表项的列表,以及计算当前视图中需要渲染的列表项。 动态渲染是 Vue 虚拟列表的第三个关键技术。它通过动态添加和删除DOM元素来减少渲染所需的时间和资源。 我们还使用一个监听滚动事件的方法 onScroll 来更新可见区域的起始索引,从而更新视图中显示的列表项。 总之,Vue 虚拟列表是一种优化大型列表的渲染性能的技术。 在 Vue 中实现虚拟列表通常需要遵循一些步骤,如计算列表项的高度或宽度、计算屏幕可见区域的高度或宽度、计算当前视图中需要渲染的列表项、维护一个缓存池以及动态地添加和删除DOM元素。
虚拟列表是为了提高页面性能而出现的。我们知道,一个页面上的 DOM 树越复杂,节点越多性能越低,每次重排(reflow)的成本越高。于是,虚拟列表出现了。 渲染 50 个 Node,实际只渲染了可见部分的 Node 本篇文章不讨论如何实现一个虚拟列表,此类文章网上有很多。但是有关于回退页面无法回到虚拟列表上一次的位置的文章却很少。 (如果设置 history.scrollRestoration = 'auto',默认为 auto) 但是如果用了虚拟列表,这里的虚拟列表跟随 document 根节点(document.documentElement react-virtuoso 一种方式是,记录之前虚拟列表容器的高度,在回退回来之后先用之前记录的值去撑开整个容器高度,待虚拟列表加载后去除。 这样有个问题是虚拟列表无法知道当前的位置原来是什么内容,因为虚拟列表都是按照单个 Node 高度去计算的,整体高度是一个预估值,不能知道当前位置具体是什么。
IntersectionObserver实现虚拟列表初探 http://zoo.zhengcaiyun.cn/blog/article/intersectionobserver 前言 前端开发中经常会遇到大数据量列表展示的性能问题 解决这类问题的方案也有很多,使用虚拟列表展示是一个比较常见的解决方案。今天我们来介绍如何使用 IntersectionObserver 这个 API 来自定义实现虚拟列表。 传统列表 在未使用虚拟列表之前,传统列表很难处理大量数据的渲染问题,常出现以下情况: 列表数据渲染时间长甚至出现白屏 列表交互卡顿 为了解决该类问题,我们可以选用虚拟列表来承载大量数据的渲染,增强用户体验 虚拟列表 在介绍 IntersectionObserver 之前,我们先简单介绍下虚拟列表概念。前面已经提到,页面的性能问题是由于太多数据渲染展示引起的。 结语 虚拟列表是解决大数据量列表渲染的有效方案。对于实际业务中对老版本浏览器兼容性要求不高的场景,大家可以考虑使用 IntersectionObserver,可以方便地实现自定义的虚拟列表。
于是心血来潮决定从零自己实现一个虚拟滚动列表来优化一下整体的体验。 当用户当前的滚动offset未触发下标更新时,则因为本身phantom的长度关系让虚拟列表拥有和普通列表一样的滚动能力。 优化: 对于上边我们实现的虚拟列表,大家不难发现一但进行了快速滑动就会出现列表闪烁的现象/来不及渲染、空白的现象。还记得我们一开始说的 **渲染用户最大可见条数+“BufferSize” 么? 现在我们已经实现了“定高”元素的虚拟列表的实现,那么如果说碰到了高度不固定的超长列表的业务场景呢? 一般碰到不定高列表元素时有三种虚拟列表实现方式: 对输入数据进行更改,传入每一个元素对应的高度 dynamicHeight[i] = x x 为元素i 的行高 需要实现知道每一个元素的高度(不切实际)
使用效果:团队第一时间尝试了虚拟列表,但是效果并不是非常理想,主要问题有以下几点: 由于我们的列表内容不是所有的Item都是等高的,所以虚拟列表每次渲染的时候都会去动态计算每个Item的高度,造成列表高度变换抖动 Item高度,计算量太大,也会阻碍页面渲染; 基于以上问题,我们团队最终出品了更佳(没有最佳,只有更佳)虚拟列表方案。 主要看一下虚拟列表节点组成: ? 5.2 前期思考 1)继续采用监听可视区域,只渲染可视区域内的节点。 2)由于Item不等高问题,需要动态计算每个Item的高度,效果不佳,我们放弃。 性能提升总结 可以看出在使用虚拟列表对页面进行优化之后,页面总的渲染性能会有一个质的提升,页面列表渲染速度提升了将近45%,按钮点击响应速度提升了将近50%。 目前我们只是针对航班列表使用了虚拟列表进行优化,页面中还有一个比较损耗性能的点是上方的日历列表,后期我们将把日历列表也改成虚拟列表,相信性能会更进一步提升。
element-ui,table增加虚拟列表 强烈推介IDEA2020.2破解激活 参考文献https://juejin.im/entry/5aaf66f56fb9a028c71e403e 由于业务需要,当大批量的dom(10W个场景)展现在table中,会导致滚动条卡顿,因此需要开发一个虚拟列表的功能
[root@controller ~]# openstack port list ID Name MAC Address Fixed IP Addresses Status 0e59952e-8ece-4bb3-8f9e-48b1c790fe16 fa:16:3e:46:9a:80 ip_address='10.0.0.2', subnet_id='2e2086da-6acb-499e-a22e-a3906bcf48e7' ACTIVE 19136274-b455-4598-b264-5c928aaf73
上次分享了超长列表分片加载的方式,这种方式现在一般不会使用,因为dom会变的无比庞大,页面会很卡,今天分享用vue实现一个虚拟列表的简易实现,本来是想用原生实现一个,后来觉得直接使用computed,简单一些 思路就是用vue的for循环渲染列表,自己手动加一个滚动条,然后通过监听scroll,算出应该显示到第几个,通过计算属性截取显示的数据,直接上代码: <! for (let i = 0; i < 1000000; i++) { this.list.push('列表' + i) 其实原理很简单,把代码跑起来,输出看看这些数据就很容易就搞懂虚拟列表的实现了。但这只是实现,要想做的更好就很难了。 要是想做高度不固定的,那就更难了,要缓存每个列表的高度,然后用一些算法去计算滚动过程的高度。
一、协作背景与性能挑战 在我们航道管理的 Vue3 项目中,航标数据列表页是核心交互场景。 初始优化请求 向 CodeBuddy 输入提示: "优化 Vue3 列表渲染性能,当前1000条数据滚动卡顿,项目使用 Vue3 + Vite + Element Plus" AI 快速定位两大核心问题 虚拟列表方案生成 CodeBuddy 推荐使用 vue-virtual-scroller 并生成集成代码: # 安装依赖 npm install vue-virtual-scroller <template ${item.id}`, () => { return item.price * (1 - item.discount) }) } </script> 四、最终优化效果验证 关键改进点: 虚拟滚动技术将渲染节点控制在视窗范围内 过程中,采用渐进式优化策略第一阶段:快速解决DOM爆炸问题(虚拟列表)第二阶段:优化数据加载流程(分页+骨架屏)第三阶段:微优化计算属性(缓存策略)。
本篇讨论基于 Vue.js 的列表无限下拉实践。 我们的目标就是:让列表下拉纵享丝滑,而不是像以往的下拉就 loading 等待的体验。 -- 虚拟列表 --> <virtual-list :data-key="'pageid'" :data-sources="results" :data-component -- loading --> <loader v-if="loading" />
在 React 中实现虚拟列表(Virtual List)是优化长列表性能的关键技术,它通过只渲染可视区域内的项目来减少 DOM 节点数量,提升页面流畅度。 React, { useState, useRef, useEffect } from 'react';const BasicVirtualList = ({ items, // 所有列表数据 使用成熟的第三方库对于复杂场景,推荐使用经过优化的成熟库:react-window轻量级虚拟列表库,专注于性能和简单API。 选择建议简单固定高度列表:基础手动实现或 react-window动态高度列表:动态高度实现或 react-virtualized复杂场景(网格、表格):react-virtualized 或 react-window 的网格组件极致性能需求:考虑 Web Workers 处理大数据计算虚拟列表的核心是减少DOM节点数量和精准计算可视区域,实际项目中可根据列表复杂度和性能要求选择合适的实现方式。
.虚拟列表 其核心思想就是在处理用户滚动时,只改变列表在可视区域的渲染部分,然后使用padding或者translate来让渲染的列表偏移到可视区域中,给用户平滑滚动的感觉。 虚拟列表原理 虚拟列表的核心步骤可以总结成五步: 不把长列表数据一次性全部直接渲染在页面上 截取长列表一部分数据用来填充可视区域 长列表数据不可视部分使用空白占位填充(下图中的startOffset和endOffset 值和列表项的top来得出列表的开始索引。 当用户滚动时,我们需要一直更新这个缓存数组中的列表项信息,目的是下次计算就能使用列表项的真实高度和位置,从而准确渲染出列表项。 positionCache[endIndex].bottom}px`, }; }, [positionCache, startIndex], ); 最后 感谢你能看到这里,文中实现了两种情况的虚拟列表
什么是虚拟列表 虚拟列表是指对列表的 可视区域 进行渲染,对 非可见区域 不渲染或部分渲染,从而极大提高渲染性能的一种技术。 虚拟列表 就是对长列表的一种优化方式,通过只渲染可视区域数据,大大提高渲染性能。 如何使用虚拟列表 目前虚拟列表已经有很多知名的库,如 vue-virtual-scroller、vue-virtual-scroll-list、react-virtualized 等, 下面就给大家介绍一下 vue-virtual-scroller 这个优秀库的使用方法,然后再带大家实现一个简版的虚拟列表。 虚拟列表原理 初次听到 “虚拟列表” 这个名词感觉非常的高大上,其实弄清楚它的原理之后,你会发现它非常的简单。话不多说,先上图: 可视区容器:可以看作是在最底层,容纳所有元素的一个盒子。
在高性能渲染十万条数据(时间分片)一文中,提到了可以使用 时间分片的方式来对长列表进行渲染,但这种方式更适用于列表项的DOM结构十分简单的情况。本文会介绍使用 虚拟列表的方式,来同时加载大量数据。 那么可以想象的是,当列表项数过多并且列表项结构复杂的时候,同时渲染时,会在 RecalculateStyle和 Layout阶段消耗大量的时间。 而 虚拟列表就是解决这一问题的一种实现。 什么是虚拟列表 虚拟列表其实是按需显示的一种实现,即只对 可见区域进行渲染,对 非可见区域中的数据不渲染或部分渲染的技术,从而达到极高的渲染性能。 实现 虚拟列表的实现,实际上就是在首屏加载的时候,只加载 可视区域内需要的列表项,当滚动发生时,动态通过计算获得 可视区域内的列表项,并将 非可视区域内存在的列表项删除。 从演示效果上看,我们实现了基于 文字内容动态撑高列表项情况下的 虚拟列表,但是我们可能会发现,当滚动过快时,会出现短暂的 白屏现象。
当面对成千上万条数据时,传统的列表渲染方式往往会导致页面卡顿、响应迟缓,严重影响用户体验。而虚拟列表库的出现,为这一难题提供了优雅的解决方案。如何用JavaScript打造一个高性能的虚拟列表库? 列表项的高度是影响虚拟列表性能的关键因素。如果所有列表项高度一致,计算和渲染会变得相对简单。但在现实应用中,列表项高度往往各不相同,比如包含不同长度文本的新闻列表。 处理动态高度列表时,需要更复杂的算法来精确计算每个数据项的位置,这对虚拟列表库的设计提出了更高要求。在列表滚动过程中,频繁的DOM操作会触发浏览器的重排和重绘,严重影响性能。 虚拟列表很少是孤立存在的,它通常需要与筛选器、搜索框等其他组件协同工作。如何在数据过滤或搜索后,快速更新虚拟列表的展示,同时保持高性能,是开发者需要解决的另一挑战。 打造高性能虚拟列表库的最后一环,是严格的测试与持续优化。通过模拟不同数据规模、不同设备性能的场景,检测列表的滚动流畅度、内存占用和响应时间。
普通列表 主要方法:calcList <template>