VUE 简单版虚拟列表

如果列表数据有几千几万条的话,一次渲染出来会导致页面卡顿。除了懒加载分页加载数据还可以使用虚拟列表来解决这个问题。虚拟列表的高度是整个列表实际的高度,但是实际渲染的只是可视窗口部分的内容,通过滚动时,可视区域内部分向下偏移和更新可视区域内的数据来实现。

vue-virtual-scroller是VUE官网推荐的一个虚拟列表库,地址:
https://github.com/Akryum/vue-virtual-scroller/tree/master/packages/vue-virtual-scroller

这里实现了一个每项数据高度固定的简单的虚拟列表:

<template><!-- 最底层的可视区容器 --><div ref="list" class="infinite-list-container" @scroll="scrollEvent($event)"><!-- 中间的可滚动区域,z-index=-1,高度和真实列表相同,目的是出现相同的滚动条 --><div class="infinite-list-phantom" :style="{ height: listHeight + 'px' }"></div><!-- 最上层的可视区列表,数据和偏移距离随着滚动距离的变化而变化 --><div class="infinite-list" :style="{ transform: getTransform }"><div class="infinite-list-item" v-for="item in visibleData" :key="item.id" :style="{ height: itemSize + 'px' }">{{ item.label }}</div></div></div>
</template><script>
const list = []
for (let i = 0; i < 10000; i++) {list.push({id: i,label: `virtual-list ${i}`})
}export default {name: 'MyVirtualList',data() {return {//列表数据items: list,//列表项高度itemSize: 50,screenHeight: 0, //可视区域高度startOffset: 0, //偏移距离start: 0, //起始索引end: 0 //结束索引}},computed: {//列表总高度listHeight() {return this.items.length * this.itemSize},//可视区列表的项数visibleCount() {return Math.ceil(this.screenHeight / this.itemSize)},//可视区列表偏移距离对应的样式getTransform() {return `translate3d(0,${this.startOffset}px,0)`},//获取可视区列表数据visibleData() {return this.items.slice(this.start, Math.min(this.end, this.items.length))}},mounted() {this.screenHeight = this.$refs.list.clientHeightthis.start = 0this.end = this.start + this.visibleCount},methods: {scrollEvent() {//当前滚动位置let scrollTop = this.$refs.list.scrollTop//此时的开始索引this.start = Math.floor(scrollTop / this.itemSize)//此时的结束索引this.end = this.start + this.visibleCount//此时的偏移距离this.startOffset = scrollTop - (scrollTop % this.itemSize)//每次滚动一个完整的item的时候,可视区域才会进行向下偏移,如果和滚动的距离保持实时一样的话,可视区视觉上就没有滚动的效果,只是数据在改变}}
}
</script><style scoped>
.infinite-list-container {height: 100%;overflow: auto;position: relative;
}.infinite-list-phantom {position: absolute;left: 0;top: 0;right: 0;z-index: -1;
}.infinite-list {left: 0;right: 0;top: 0;position: absolute;
}.infinite-list-item {line-height: 50px;text-align: center;color: #555;border: 1px solid #ccc;box-sizing: border-box;
}
</style>

参考链接:
https://cn.vuejs.org/guide/best-practices/performance.html
https://segmentfault.com/a/1190000041068198?utm_source=sf-similar-article

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSRF,XSS攻击与预防

CSRF CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为“One Click Attack”或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。 在使用Cookie作为登录标记的系统上&#xff0c;Cookie泄露…

0329 ***

给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长连续子字符串的长度 链接 const lengthOfLongestSubstring function(s) {const arr []let maxl 0for(let i 0;i<s.length;i){console.log(s[i])if(arr.indexOf(s[i]) -1){arr.push(s[i])maxl Math.max(m…

警惕.360勒索病毒:如何预防.360勒索病毒攻击

导言&#xff1a; 在网络安全领域&#xff0c;勒索病毒是一种非常危险的恶意软件&#xff0c;它以其独特的加密方式和高昂的赎金要求&#xff0c;给个人和企业带来了严重的损失。.360勒索病毒便是其中之一&#xff0c;它属于BeijingCrypt勒索病毒家族&#xff0c;具有高度的隐…

office安装和卸载

目录 安装文件下载安装破解卸载 安装文件下载 链接&#xff1a;https://pan.baidu.com/s/1cBRv-NwNOf2pQyd7XBRu6A?pwdabcd 提取码&#xff1a;abcd 提供内容如下: ├── pdf │ ├── Access2007宝典.pdf │ ├── Excel2007宝典.pdf │ ├── Project2007完全掌…

python读取ply文件

ply文件&#xff0c;是"Polygon File Format"的简称&#xff0c;即多边形文件格式。一般可以理解为&#xff0c;一个ply文件表示一个三维图形。 python常见的读取ply文件的方法有两个&#xff1a;plyfile和open3d plyfile读取ply文件&#xff1a; 安装ply: pip inst…

scGRN:人与鼠的GRN平台

基因调控网络GRN是包含转录因子TFs与其下游靶基因之间的调控相互作用的可解释图模型。了解GRN的拓扑结构和动力学是解释疾病病因机制和将相应发现转化为新疗法的基础。单细胞多组学技术的最新进展促使从单细胞转录组学和表观基因组学数据中以前所未有的分辨率推断GRN。在这里&a…

ClickHouse03-小白如何快速搭建ClickHouse集群

普通测试通常使用ClickHouse单节点就可以了&#xff0c;但是生产环境不免需要考虑多活、负载等高可用问题&#xff0c;集群就成了基础需求 ClickHouse在集群的选择上&#xff0c;作者已知的有两种&#xff1a; 使用ZooKeeper作为节点协调的组件&#xff0c;使用ClickHouse-Kee…

红米手机Redmi 不会自动弹出USB调试选项,如何处理?(红米小米均适用)

参考&#xff1a; 红米手机Redmi 不会自动弹出USB调试选项&#xff0c;如何处理&#xff1f;&#xff08;红米小米均适用&#xff09; - 知乎 以红米9A为例&#xff1b; 【设置】菜单进入后&#xff0c;找到【我的设备】&#xff0c; 选择【全部参数】&#xff0c; 对准miui版…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …

测试人员如何提交一条高质量的bug

测试人员在测试软件过程中&#xff0c;发现bug是必然的&#xff0c;那么发现bug后就要提交bug到缺陷管理系统中&#xff0c;如何提交一条高质量的bug&#xff0c;是每一个测试人员值得深思的问题&#xff0c;如果bug提交的不规范&#xff0c;不准确会导致开发人员理解错误&…

Springboot拦截器的使用

* 1、编写一个拦截器实现HandlerInterceptor接口 * 2、拦截器注册到容器中&#xff08;实现WebMvcConfigurer的addInterceptors&#xff09; * 3、指定拦截规则【如果是拦截所有&#xff0c;静态资源也会被拦截】 这段代码定义了一个 LoginInterceptor 类&#xff0c;它实现了…

Python工具箱系列(五十一)

九宫格与词云 对图片进行九宫格切割&#xff0c;并且放到微信朋友圈曾经风靡一时。对于python来说&#xff0c;这个也非常简单。 from PIL import Image import mathdef ninerectanglegrid(inputfilename):"""实现九宫格切割Args:inputfilename (string): 输入…

golang import引用项目下其他文件内函数

初始化项目 go mod init [module名字] go mod init project 项目结构 go mod 文件 代码 需要暴露给外界使用的变量/函数名必须大写 在main.go中引入&#xff0c;当前项目模块名/要引用的包名 package mainimport (// 这里的路径开头为项目go.mod中的module"project/…

DHCP设置二

华为ensp模拟实验 准备工作 需要设备&#xff1a;路由器 一台 交换机 两台 pc两台 ip划分网段 &#xff1a;192.168.10.0 24 192.168.20.0 24 当我们准备好之后就可以开机了 开机实验 点击菜单栏小三角&#xff0c;开启设备。 输入system-view进入系统视图&#x…

深度解析:Elasticsearch检索请求原理

在上一篇文章中&#xff0c;我们学习了 Elasticsearch 的写入流程&#xff0c;今天我们来学习一下 Elasticsearch 的读取流程&#xff0c;当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢&#xff1f; 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

【代码片】图像处理工具OpenCV、JAI、ImageJ、Thumbnailator和Graphics2D

Graphics2D图像压缩 import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File;public class ImageResolutionModifier {public static void main(String[] args) {// 输入图片路径和输出图片路径String inputImagePath …

卓翼飞思全国合作伙伴火热招募,共筑智能生态

摘要&#xff1a;市场有可为&#xff0c;政策高扶持 抢占AI高地&#xff0c;共筑智能生态 卓翼飞思全国合作伙伴招募计划 在人工智能的浪潮下&#xff0c;我们正见证一个由数据驱动、智能主导的新时代的到来。无人智能技术作为人工智能领域的重要分支&#xff0c;正在以其独特…

axios详解

文章目录 axios简介axios特性1. 基于 Promise2. 浏览器和 Node.js 都支持3. 拦截请求和响应&#xff08;axios鉴权&#xff09;4. 自动转换 JSON 数据5. 转换请求和响应数据6. 取消请求7. 广泛的配置选项8. 客户端支持防止 CSRF/XSRF9. 支持 HTTP 授权10. 良好的错误处理 axios…

Qt篇——Qt无法翻译tr()里面的字符串

最近遇到使用Qt语言家翻译功能时&#xff0c;ui界面中的中文都能够翻译成英文&#xff0c;但是tr("测试")这种动态设置给控件的中文&#xff0c;无法翻译&#xff08;lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译&#xff09;。 上网搜了很多资料&am…

Linux 常用命令(1)

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;Linux 随笔集合 …