当前位置: 首页 > news >正文

使用 vue-virtual-scroller 实现高性能传输列表功能总结

在复杂的前端应用中,实时传输列表(如上传/下载任务列表)的渲染性能至关重要。尤其当列表项众多且频繁更新时,直接渲染所有项会带来严重的性能瓶颈。vue-virtual-scroller 作为一款高性能的虚拟滚动组件,可有效提升列表渲染效率。以下是我使用过程中的一些小总结


1. 选择合适的虚拟滚动组件:RecycleScroller 与 DynamicScroller

  • RecycleScroller 支持固定高度和可变高度列表,且允许传入自定义尺寸 item-size,渲染效率极高,适合绝大多数定高或高度变化不大的列表项场景。
  • DynamicScroller 支持不定高列表,适用场景更广,但相比 RecycleScroller,性能略有损耗,尤其在频繁更新时需要谨慎使用。

建议:
优先使用 RecycleScroller 并尽量固定或合理预估单项高度,确保性能最佳。若确实存在大量不规则高度的列表项,才考虑用 DynamicScroller 并做好性能监控和优化。


2. 列表对象尽量复用,避免替换引用

频繁轮询传输状态并更新列表数据时,建议尽量修改已有列表对象属性,而非整体替换数组或对象引用。

  • 复用对象引用,能让 vue-virtual-scroller 正确判断哪些项需要重新渲染,避免整个列表被重绘。
  • 避免直接用新数组替换旧数组,尤其是传入给 vue-virtual-scrolleritems 属性。

3. 组件中不要给外层容器整体添加 key

  • 给列表项最外层组件或容器整体添加 key,会导致 vue-virtual-scroller 失去控件复用的效果,强制每次都重新渲染。
  • 仅对真正需要动态更新的子组件,如进度条或状态显示,使用 key 来保证正常刷新。

此优化点对性能影响显著,避免无谓的渲染浪费。


4. 子组件中避免 computed 返回函数

Vue 中,computed 返回是响应式缓存值;但如果 computed 返回的是函数(即高阶函数),每次访问都会重新执行,导致频繁渲染。

  • 传输列表中频繁更新的状态项,不建议这样使用。
  • 应改为直接返回具体计算结果,或使用方法(methods)替代。

5. 异步操作复用 Promise,避免重复请求

传输列表 item 项中的异步操作(如请求状态或进度)通常高频调用,为避免重复请求和资源浪费:

  • 使用一个对象或 Map 来缓存正在进行的 Promise;
  • 同一请求若已发起,直接复用已有 Promise,等待结果;
  • 请求完成后清理缓存。

示例:

const promiseCache = {}function fetchStatus(id) {if (promiseCache[id]) {return promiseCache[id]}const promise = asyncFetchStatus(id).finally(() => {delete promiseCache[id]})promiseCache[id] = promisereturn promise
}

参考链接

  • vue-virtual-scroller 官方 GitHub

总结

借助 vue-virtual-scroller,结合以上优化策略,能显著提升传输列表的渲染效率和响应速度:

  • 优先选用合适虚拟滚动组件(RecycleScroller)
  • 保持数据对象引用稳定,避免整体替换
  • 谨慎使用 key 控制渲染范围
  • 避免高频执行的 computed 函数写法
  • 异步请求重用 Promise 减少网络压力

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏或留言交流 😊


文章转载自:

http://TvIeQuTE.jppdk.cn
http://hZb9UJ2Y.jppdk.cn
http://SUhgUtQF.jppdk.cn
http://ECQCRVLK.jppdk.cn
http://2pIDNJby.jppdk.cn
http://7A20SEV6.jppdk.cn
http://mYDo6bW5.jppdk.cn
http://oi1KdV0x.jppdk.cn
http://a02N3Z8f.jppdk.cn
http://yp7rlu5R.jppdk.cn
http://3OfQxUDP.jppdk.cn
http://VcB121Eq.jppdk.cn
http://jd664joe.jppdk.cn
http://maZEeg3C.jppdk.cn
http://XY6lFrAv.jppdk.cn
http://ZKCnx4mC.jppdk.cn
http://hw2zdkb4.jppdk.cn
http://W0xdXhhd.jppdk.cn
http://rDm66nBy.jppdk.cn
http://kasYpWy9.jppdk.cn
http://H5QNGWZt.jppdk.cn
http://HLkeMJpU.jppdk.cn
http://HrCrZitO.jppdk.cn
http://j7cWpfT8.jppdk.cn
http://rRInWIqi.jppdk.cn
http://716m93ym.jppdk.cn
http://0N9UaBeb.jppdk.cn
http://MSgw5gWx.jppdk.cn
http://vUWW8YP6.jppdk.cn
http://pJSRtyMU.jppdk.cn
http://www.dtcms.com/a/381470.html

相关文章:

  • python 实现 transformer 的 position embeding
  • 003 cargo使用
  • 制作一个简单的vscode插件
  • 【算法详解】:从 模拟 开始打开算法密匙
  • kubeadm搭建生产环境的单master多node的k8s集群
  • RocketMQ存储核心:MappedFile解析
  • 7.k8s四层代理service
  • Stable Virtual Camera:Stability AI等推出的AI模型 ,2D图像轻松转3D视频
  • Golang并发编程及其高级特性
  • 给AI配一台手机+电脑?智谱AutoGLM上线!
  • 怎么在手机上选择一款好用的桌面待办清单工具
  • 傲琪人工合成石墨片:破解智能手机散热困境的创新解决方案
  • LeetCode 刷题【74. 搜索二维矩阵、75. 颜色分类、76. 最小覆盖子串】
  • 【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell
  • SRE 系列(七)| 从技术架构到团队组织
  • 网络安全-vulnhub-Web developer 1
  • 国产延时芯片EH3B05上电延时3秒开关机芯片方案超低功耗
  • vivado下载程序后不弹出ila窗口
  • 【VC】 error MSB8041: 此项目需要 MFC 库
  • S7-200 SMART PLC 安全全指南:配置、漏洞解析与复现防护
  • 点可云进销存商城如何部署在微信小程序
  • 安卓学习 之 界面切换
  • 从 IDE 到 CLI:AI 编程代理工具全景与落地指南(附对比矩阵与脚本化示例)
  • 王道数据结构 学习笔记
  • 畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
  • 在springboot中使用mock做controller层单元测试,请求示例包括GET(带参数)、POST(带请求头)、下载文件、上传文件等
  • Kafka 线上问题排查完整手册
  • 数据结构中的排序秘籍:从基础到进阶的全面解析
  • NFS 服务器 使用
  • Zookeeper:分布式协调服务