位置: 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)

  • iqooz5x是什么屏幕

    iqooz5x是什么屏幕

  • qq空间上传视频怎么不被压缩(qq空间上传视频怎么保持原画质)

    qq空间上传视频怎么不被压缩(qq空间上传视频怎么保持原画质)

  • word图片边框怎么设置(word图片边框怎么加粗)

    word图片边框怎么设置(word图片边框怎么加粗)

  • 红米m1901f7e是什么型号(红米m1901f9e)

    红米m1901f7e是什么型号(红米m1901f9e)

  • p30锁屏时间位置(华为p30pro锁屏时间位置移动)

    p30锁屏时间位置(华为p30pro锁屏时间位置移动)

  • iphone11从安卓设备转移数据在哪里(苹果11怎么把安卓手机数据导入苹果手机)

    iphone11从安卓设备转移数据在哪里(苹果11怎么把安卓手机数据导入苹果手机)

  • asus smart gesture可以卸载吗(asus smart gesture可以关闭吗)

    asus smart gesture可以卸载吗(asus smart gesture可以关闭吗)

  • qq没有开设备锁为什么还要验证(qq没有开设备锁了登录不了怎么办)

    qq没有开设备锁为什么还要验证(qq没有开设备锁了登录不了怎么办)

  • 安卓手机用久了为什么会卡(安卓手机用久了发热严重)

    安卓手机用久了为什么会卡(安卓手机用久了发热严重)

  • 淘宝定单删了怎么找回(淘宝订单删了还能找回来吗)

    淘宝定单删了怎么找回(淘宝订单删了还能找回来吗)

  • 怎么退出talkback模式(小米怎么退出talkback)

    怎么退出talkback模式(小米怎么退出talkback)

  • 淘宝售假扣分多久清零(淘宝售假扣多少分)

    淘宝售假扣分多久清零(淘宝售假扣多少分)

  • 浏览器下载视频怎么用流量(浏览器下载视频如何保存本地)

    浏览器下载视频怎么用流量(浏览器下载视频如何保存本地)

  • 邮件合并步骤(邮件合并步骤六个步骤)

    邮件合并步骤(邮件合并步骤六个步骤)

  • 华为手环3e和4e的区别(华为手环3e和4e区别)

    华为手环3e和4e的区别(华为手环3e和4e区别)

  • 怎么把两个视频合成一个视频(怎么把两个视频连接到一起)

    怎么把两个视频合成一个视频(怎么把两个视频连接到一起)

  • ipad air3多少英寸(ipad air3多少尺寸)

    ipad air3多少英寸(ipad air3多少尺寸)

  • 如何设置小米手机时钟样式(如何设置小米手机铃声)

    如何设置小米手机时钟样式(如何设置小米手机铃声)

  • 饿了么如何投诉骑手(饿了么如何投诉骑手超时)

    饿了么如何投诉骑手(饿了么如何投诉骑手超时)

  • 副卡可以打电话吗(副卡可以打电话不能用流量怎么回事)

    副卡可以打电话吗(副卡可以打电话不能用流量怎么回事)

  • 智慧识屏是什么意思(智慧识屏是什么东西)

    智慧识屏是什么意思(智慧识屏是什么东西)

  • MATLAB与图像处理的那点小事儿~(matlab用于图像处理)

    MATLAB与图像处理的那点小事儿~(matlab用于图像处理)

  • echarts文档解读(echarts api文档)

    echarts文档解读(echarts api文档)

  • metarecover命令  恢复软分区信息(metareplace -e)

    metarecover命令 恢复软分区信息(metareplace -e)

  • 金税开票软件下载安装
  • 小规模公司减免的增值税怎么算
  • 金税盘证书密码被锁死
  • 税收滞纳金还会计算滞纳金吗
  • 资金账簿印花税和营业账簿的区别
  • 残保金为啥经过个人账户
  • 一般纳税人开具专票和普票的区别
  • 适用5%征收率的范围
  • 营业费用和营业收入的关系
  • 个体户定额交税还用交个税吗
  • 房地产常用的付款方式有哪三种
  • 固定资产减少当月
  • 资产负债表日后调整事项与非调整事项的区别
  • 房贷抵扣个税如何设置100%
  • 大额虚开发票做转出税款入什么会计科目?
  • 补提折旧以前年度损益调整汇算清缴怎么处理
  • 超市商品打折怎么算出来
  • 商品过期可以向商家索要赔偿吗
  • 银行余额调节表模板
  • 发票的受票方是什么
  • 税款滞纳金怎么入账
  • 差额纳税账务处理
  • 研发费用没做账怎么调账
  • 我的初级备考经验怎么写
  • 劳动保护用品应由什么开支
  • 政府高薪补贴
  • 简易计税项目进项
  • 冲销以前年度多做的其他应收款
  • 企业所得税什么时候交
  • vscode国内镜像
  • 把原材料给别人加工怎么入账
  • 代个人多交的社保怎么查
  • 个人投资额是什么意思
  • 国家规定发票多久之内可以开
  • 个体工商户筹集资金的难易程度
  • 委托加工物资实际成本构成一般包括
  • 珀斯临近什么洋
  • 旅行社差额征税税率是多少
  • 跨域问题是什么
  • 冲掉应收账款
  • 微信收款怎么做会计分录
  • 税控会计分录
  • 上个月发票税率怎么查
  • 认证发票可以分两次进行吗
  • 残疾基金出什么科目
  • 已开发票作废和空白发票作废有什么不一样?
  • 营业执照需要提交什么材料
  • 资产管理业务是表外业务吗
  • 小规模纳税人增值税申报表怎么填
  • mysql修改表结构的关键字
  • 典当行必须出具当票吗
  • 期货风险准备金计提比例
  • 增值税不用计提吗
  • 红冲去年暂估的费用怎么做账
  • 收到存款利息属于资金周转吗
  • 事业单位用电收费标准
  • 股权转让如何避免转让前债务
  • mssqlserveradhelper
  • mac怎么复制文件路径地址
  • 大白菜u盘启动按f几
  • mac屏幕共享软件
  • win10系统如何开启远程桌面连接
  • 空磁盘为什么有已用空间
  • linux常用命令find
  • Unity3D游戏开发培训课程大纲
  • dos测试网络连接
  • JavaScript不支持ie
  • Node.js中的construct
  • 如何用python连接数据库
  • Jquery针对tr td的一些实用操作方法(必看篇)
  • jquery的实现原理
  • js中的set
  • 电力行业增值税管理办法
  • 增值税发票综合服务平台登录不了
  • 诺诺开票软件怎么领用发票
  • 什么是核心征管申报
  • 税务局大厅咨询台
  • 怎么查询公司法人电话号码
  • 加拿大鹅海关被税交多少
  • 青岛市医保网上办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设