vue实现虚拟列表功能的代码


Posted in Javascript onJuly 28, 2020

当数据量较大(此处设定为10w),而且要用列表的形式展现给用户,如果我们不做处理的话,在浏览器中渲染10w dom节点,是极其耗费时间的,那我的Macbook air举例,10w条数据渲染出来到能看到页面,需要13秒多(实际应该是10秒左右),如果是用户的话肯定是不会等一个网页十几秒的

vue实现虚拟列表功能的代码

我们可以用虚拟列表解决这个问题
一步步来
首先看一下效果

vue实现虚拟列表功能的代码

这是data中的数据

data() {
  return {
   list: [], // 贼大的数组
   li: {
    // 列表项信息
    height: 50,
   },
   container: {
    // 容器信息
    height: 500,
   },
   pos: 1, // 第一排显示的元素的下标
   MAX_NUM: 1, // 在容器内最多显示几个列表项
   timer: null, // 定时器
   carriedOut: true, // 能不能执行操作
  };
 },

然后在mounted中创建一个贼大的数组,在调用test方法计算第一次的虚拟列表中有哪些

mounted() {
  // 创建一个贼大的数据数组
  for (let i = 0; i < 100000; i++) {
   this.list.push(i);
  }
  this.test();
 },

test方法

test() {
   // 节流
   if (this.carriedOut) {
    // 容器跟里面的列表项
    const { container, li } = this;
    // 计算可视区域最多能显示多少个li
    this.MAX_NUM = Math.ceil(container.height / li.height);
    // 获取 overflow:scroll 的元素已滚动的高度
    let scrollTop = this.$refs.container.scrollTop;
    // 计算当前处于第一排的元素的下标
    this.pos = Math.round(scrollTop / li.height);
    // 下方节流操作
    this.carriedOut = false;
    this.timer = setTimeout(() => {
     this.carriedOut = true;
     clearTimeout(this.timer);
    }, 50);
   }
  },

然后是computed

computed: {
  // 用于渲染在页面上的数组
  showList() {
   // 根据计算出来的 第一排元素的下标,和最多显示多少个 用slice实现截取数组
   let arr = this.list.slice(this.pos, this.pos + this.MAX_NUM);
   return arr;
  },
 },

这是html,注意监听了div的scroll事件,并且调用的是test方法

<div class="virtual-list">
  <h1>虚拟列表</h1>
  <div class="container" ref="container" :style="`height:${container.height}px`" @scroll="test">
   <ul :style="`height:${li.height*list.length}px;padding-top:${li.height*pos}px`">
    <li :style="`height:${li.height}px`" v-for="item in 100000" :key="item">{{item}}</li>
   </ul>
  </div>
 </div>

完整源代码

<template>
 <div class="virtual-list">
  <h1>虚拟列表</h1>
  <div class="container" ref="container" :style="`height:${container.height}px`" @scroll="test">
   <ul :style="`height:${li.height*list.length}px;padding-top:${li.height*pos}px`">
    <li :style="`height:${li.height}px`" v-for="item of showList" :key="item">{{item}}</li>
   </ul>
  </div>
 </div>
</template>

<script>
export default {
 data() {
  return {
   list: [], // 贼大的数组
   li: {
    // 列表项信息
    height: 50,
   },
   container: {
    // 容器信息
    height: 500,
   },
   pos: 1, // 第一排显示的元素的下标
   MAX_NUM: 1, // 在容器内最多显示几个列表项
   timer: null, // 定时器
   carriedOut: true, // 能不能执行操作
  };
 },
 mounted() {
  // 创建一个贼大的数据数组
  for (let i = 0; i < 1000; i++) {
   this.list.push(i);
  }
  this.test();
 },
 computed: {
  // 用于渲染在页面上的数组
  showList() {
   // 根据计算出来的 第一排元素的下标,和最多显示多少个 用slice实现截取数组
   let arr = this.list.slice(this.pos, this.pos + this.MAX_NUM);
   return arr;
  },
 },
 methods: {
  test() {
   // 节流
   if (this.carriedOut) {
    // 容器跟里面的列表项
    const { container, li } = this;
    // 计算可视区域最多能显示多少个li
    this.MAX_NUM = Math.ceil(container.height / li.height);
    // 获取 overflow:scroll 的元素已滚动的高度
    let scrollTop = this.$refs.container.scrollTop;
    // 计算当前处于第一排的元素的下标
    this.pos = Math.round(scrollTop / li.height);
    // 下方节流操作
    this.carriedOut = false;
    this.timer = setTimeout(() => {
     this.carriedOut = true;
     clearTimeout(this.timer);
    }, 50);
   }
  },
 },
};
</script>

<style lang="scss" scoped>
.virtual-list {
 text-align: center;
 .container {
  overflow: scroll;
  border: 1px solid red;
 }
}
</style>

到此这篇关于vue实现虚拟列表功能的代码的文章就介绍到这了,更多相关vue 虚拟列表内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript concat数组累加 示例
Sep 03 Javascript
第一个JavaScript入门基础 document.write输出
Feb 22 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
Jul 27 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
Nov 06 Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
Sep 08 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
js实现时分秒倒计时
Dec 03 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
vue.js 解决v-model让select默认选中不生效的问题
Jul 28 #Javascript
Vue2.0 $set()的正确使用详解
Jul 28 #Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 #Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 #Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 #Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 28 #Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
Jul 28 #Javascript
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
PHP读取MySQL数据代码
2008/06/05 PHP
PHP生成带有雪花背景的验证码
2008/09/28 PHP
简单的php 验证图片生成函数
2009/05/21 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
PHP7新特性简述
2017/06/11 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
深入浅析var,let,const的异同点
2018/08/07 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
python异步Web框架sanic的实现
2020/04/27 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
个人自我评价范文
2014/02/05 职场文书
《争吵》教学反思
2014/02/15 职场文书
质检部经理岗位职责
2014/02/19 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
好学生评语大全
2014/05/05 职场文书
医学求职信
2014/05/28 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android