位置: IT常识 - 正文

vue长列表优化之虚拟列表实现(vue 长列表优化)

编辑:rootadmin
vue长列表优化之虚拟列表实现 vue长列表优化之虚拟列表实现

推荐整理分享vue长列表优化之虚拟列表实现(vue 长列表优化),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue经典的列表和编辑的问题,vue列表数据量太大如何显示,vue 长列表优化,vue无限滚动长列表优化,vue 列表,vue无限滚动长列表优化,vue无限滚动长列表优化,vue 长列表优化,内容如对您有帮助,希望把文章链接给更多的朋友!

应用场景:后台一次性发送上千条或更多数据给前台

场景模拟:用户发起一个请求,后台发送了10w条数据

使用虚拟列表之前:前台需要生成10w个dom节点用来渲染页面

使用虚拟列表之后:前台只需要生成少量dom节点(dom节点数量取决于前端视图需要展示的数量),就可以实现对这10w条数据的视图渲染

总之:虚拟列表就是固定dom节点数量,通过修改dom节点的内容而达到不重新增加(或删除)dom节点来实现列表的更新

1.实现原理

监听页面滚动,获取滚动的高度scrolltop根据scrolltop,可以知道当前应该展示哪一段数据(即获取要展示数据的index)根据当前展示的数据在长列表中的index,对列表进行偏移

实现思路是这样的:

设置列表初始值

需要展示给用户的数量showNum列表item的高度itemHeight需要展示的第一条数据的下标start需要展示的最后一条数据的下标end通过start和end已经showNum,我们可以得到需要展示的列表项showList,我们可以通过vue的计算属性来实时获取新的showList

建立列表视图模型

给列表视图设置高度ListWrapHeight根据itemHeight和showNum,我们可以得到列表总高度ListHeight,我们必须要使得ListHeight高度大于ListWrapHeight,这样才能实现滚动

监听页面滚动

给列表视图模型设置监听函数,每当列表视图发生滚动,就执行回调,获取滚动高度scrolltop通过scrolltop和itemHeight我们可以得到新的start以及end,从而获取到新的showList通过start和itemHeight我们可以给list设置偏移(translate),从而达到让start对应的数据展示在视图模型的效果vue长列表优化之虚拟列表实现(vue 长列表优化)

注意:列表视图模型和列表并不是一个东西,视图模型表示者页面供列表展示的一块区域,而列表表示的是需要展示的列表项总高度

这是列表视图模型

这是列表

列表中超出视图模型的节点就被隐藏了

为什么限制了展示列表项的长度(限制了dom数量),视图模型还能持续滚动?

给列表设置translate会增大列表的高度,既然list的高度变大了,那么视图模型就可以继续滚动

​ 实现代码

​ 以vue3为例(不管是vue2或是vue3,实现虚拟列表的核心代码都是相同的,即监听滚动,赋新值)

<div ref="listWrap" class="list-wrap" @scroll="scrollListener"> <div class="list" ref="List"> <slot v-for="item in showList" :songInfo="item" :key="item.id"></slot> </div> </div> setup(props) { const list = ref(props.list); //长列表数据 const itemHeight = ref(props.itemHeight); //item高度 const showNum = ref(props.showNum); //展示的数据 const start = ref(props.start); //滚动过程中的开始索引 const end = ref(props.end); //滚动过程中的结束索引 const listWrap = ref(null); //获取列表视图模型节点 const List = ref(null)//获取列表节点 onMounted(() => { listWrap.value.style.height = itemHeight.value * showNum.value + "px";//设置列表视图模型的高度 }); const showList = computed(() => { //获取展示的列表 return list.value.slice(start.value, end.value); }); const scrollListener = (() => { //获取滚动高度 let scrollTop = listWrap.value.scrollTop; //开始的数组索引 start.value = Math.floor(scrollTop / itemHeight.value); //结束索引 end.value = start.value + showNum.value; List.value.style.transform = `translateY(${start.value * itemHeight.value}px)`//对列表项进行偏移 }) return { ... }; },

效果:

节点变化

可以看到不论列表如何变化,列表dom的数量并没有新增

本文链接地址:https://www.jiuchutong.com/zhishi/295694.html 转载请保留说明!

上一篇:Windows10系统CUDA和CUDNN安装教程(WINDOWS10系统怎样给电脑分区)

下一篇:常见气象数据获取方式及批量下载代码汇总(气象数据32766)

  • 怎样更快的让未收录的页面尽快被收录(如何让1)

    怎样更快的让未收录的页面尽快被收录(如何让1)

  • 如何进行论坛推广,论坛推广的一些方法(如何进行论坛推销)

    如何进行论坛推广,论坛推广的一些方法(如何进行论坛推销)

  • 饮水机有塑料味怎么办(饮水机有塑料味正常吗)

    饮水机有塑料味怎么办(饮水机有塑料味正常吗)

  • qq群怎么让别人不能改自己群昵称(qq群怎么让别人都看到)

    qq群怎么让别人不能改自己群昵称(qq群怎么让别人都看到)

  • 华为p40摄像头是多少像素(华为p40摄像头是什么品牌)

    华为p40摄像头是多少像素(华为p40摄像头是什么品牌)

  • 淘宝免费取退什么意思(淘宝免费退款)

    淘宝免费取退什么意思(淘宝免费退款)

  • 微信朋友圈打开显示一条白线(微信朋友圈打开的音乐怎么关闭)

    微信朋友圈打开显示一条白线(微信朋友圈打开的音乐怎么关闭)

  • 魅族m15和15的区别(魅族15跟m15的区别)

    魅族m15和15的区别(魅族15跟m15的区别)

  • qq深色模式怎么设置(qq深色模式怎么调背景)

    qq深色模式怎么设置(qq深色模式怎么调背景)

  • wifi设置静态什么意思(wifi设置静态有什么用)

    wifi设置静态什么意思(wifi设置静态有什么用)

  • 华为mate30pro顶部两个孔是干嘛的(华为mate30pro顶部发烫)

    华为mate30pro顶部两个孔是干嘛的(华为mate30pro顶部发烫)

  • 华为matex屏幕是什么材质

    华为matex屏幕是什么材质

  • 苹果11系列屏幕大小对比(苹果11系列屏幕多少寸的)

    苹果11系列屏幕大小对比(苹果11系列屏幕多少寸的)

  • iphone6怎么手写输入(iphone6怎么手写输入法设置)

    iphone6怎么手写输入(iphone6怎么手写输入法设置)

  • vivo手机怎么调空调(vivo手机怎么调字体大小)

    vivo手机怎么调空调(vivo手机怎么调字体大小)

  • 抖音资料一天可以修改几次(抖音一天产生多少视频)

    抖音资料一天可以修改几次(抖音一天产生多少视频)

  • 华为mate30可以用谷歌吗(华为mate30可以用几年)

    华为mate30可以用谷歌吗(华为mate30可以用几年)

  • 解锁屏保广告如何取消(锁屏 广告)

    解锁屏保广告如何取消(锁屏 广告)

  • 红米note8支持内存卡吗(红米Note8支持内存扩展吗)

    红米note8支持内存卡吗(红米Note8支持内存扩展吗)

  • beats蓝牙时右耳没声音(beatssolo3蓝牙右边不响)

    beats蓝牙时右耳没声音(beatssolo3蓝牙右边不响)

  • 分区对齐2048还是4096(分区对齐远2048还是4096)

    分区对齐2048还是4096(分区对齐远2048还是4096)

  • etc怎么充值 工商银行(etc怎么充值啊)

    etc怎么充值 工商银行(etc怎么充值啊)

  • mac语音备忘录的怎么删除录音?mac语音备忘录删除录音教程(mac语音备忘录文件怎样转换成mp3)

    mac语音备忘录的怎么删除录音?mac语音备忘录删除录音教程(mac语音备忘录文件怎样转换成mp3)

  • 一文搞懂JS-Web-API——DOM(一文搞懂兰州简史)

    一文搞懂JS-Web-API——DOM(一文搞懂兰州简史)

  • 公司替员工承担个税怎么入账
  • 小规模纳税人收普票和专票有什么区别
  • 增值税有哪些二类税种
  • 海关完税价格计算公式
  • 不征税收入计入应纳税所得额吗
  • 在校大学生可以考教师资格证吗
  • 非盈利机构怎么说
  • 2021年停车费税率
  • 外地企业如何在本地纳税
  • 以应税消费品抵偿债务的计税依据
  • 可转换公司债券权益成分和负债成分
  • 持续经营损益怎么算
  • 企业所得税弥补亏损怎么算
  • 买了两个可以退一个吗
  • 收到国家退税
  • 年底给职工发啥实物
  • 个税多申报了实发没有这么多,如何处理
  • 净利润和毛利润的计算公式
  • 个体户能给自己交五险吗
  • 怎么关闭win11安装软件提示
  • iphone微信透明壁纸怎么设置
  • 笔记本电脑保养常识电池
  • 显卡性能排行榜2023
  • 公司的对公账户
  • 处置子公司的收益
  • php目录操作
  • 会计核算是什么岗位
  • 企业向个人提供咨询服务
  • 可供出售交易资产
  • php正则表达式匹配字符串
  • 开发票为什么要对公账户?
  • 电子发票重开之前的是不是就没用了
  • vue系列教程
  • for of 与for in
  • tensorflow gui
  • 实缴注册资本印花税如何缴纳
  • 股东分红放到哪个会计科目
  • 员工工资为零只缴纳社保,个税怎么处理
  • 计提税费可以记入成本吗
  • python return和yield有什么不同
  • 发票说明格式
  • 年终奖每个月发
  • sql server数据库异地备份
  • mysql主从复制实现原理
  • 企业股权转让收入会计处理
  • 营改增后还有建筑业发票吗
  • 产业扶持资金账户是什么
  • 租金摊销会计分录
  • 企业职工食堂就餐收费
  • 交增值税怎么做帐
  • 现金日记账的登记规范及要求
  • 哪些发票可以提供发票
  • 企业进项税额如何账务处理
  • 融资租赁可以折旧吗
  • 营改增后计税依据
  • 免税发票可以抵扣税收农产品吗
  • SQL Server 2012 sa用户登录错误18456的解决方法
  • mysql中增删改查语句
  • innodb底层实现原理
  • 提高搜索
  • win sth
  • xp系统如何清除所有盘的东西
  • 在linux系统中命令
  • Win10 Mobile RS2预览版14904升级截图曝光
  • linux系统怎么更改语言
  • 局域网下访问vue点击无反应
  • bootstrap 组件库
  • android方法大全
  • bat文件指令
  • unity小游戏代码
  • shell读取文本内容到变量
  • javascript主要学什么
  • androidのLinearLayout中组件右对齐
  • express 前后端分离
  • 上海退休核定表两种算法
  • 电子税务局怎么添加银行账户信息
  • 区域化管理的利与弊
  • 上海市浦东新区公租房
  • 代理记账协会成立时间
  • 零申报印花税的应税凭证名称怎么填写
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设