文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue虚拟列表如何实现

2023-07-02 14:58

关注

本篇内容介绍了“vue虚拟列表如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

多数据渲染

现在解决多数据渲染,相信大家可能会想到分页,触底加载,懒加载等等,但其实虚拟列表也是多数据高性能加载的一个重要解决方案。

虚拟列表的概念

虚拟滚动,就是根据容器可视区域的列表容积数量,监听用户滑动或滚动事件,动态截取长列表数据中的部分数据渲染到页面上,动态使用空白站位填充容器上下滚动区域内容,模拟实现原生滚动效果

vue虚拟列表如何实现

实现

基本实现

<template>  <div @scroll.passive="doScroll" ref="scrollBox">    <div : >      <div v-for="item in tempSanxins" :key="item.id">        <span>{{ item.msg }}</span>        <img :src="item.src" />      </div>    </div>  </div></template><script>import { throttle } from "../../utils/tools";export default {  data() {    return {      allSanxins: [], // 所有数据      itemHiehgt: 150, // 列表每一项的宽度      boxHeight: 0, // 可视区域的高度      startIndex: 0, // 元素开始索引    };  },  created() {    // 模拟请求数据    this.getAllSanxin(30);  },  mounted() {    // 在mounted时获取可视区域的高度    this.getScrollBoxHeight();    // 监听屏幕变化以及旋转,都要重新获取可视区域的高度    window.onresize = this.getScrollBoxHeight;    window.onorientationchange = this.getScrollBoxHeight;  },  methods: {    getAllSanxin(count) {      // 模拟获取数据      const length = this.allSanxins.length;      for (let i = 0; i < count; i++) {        this.allSanxins.push({          id: `sanxin${length + i}`,          msg: `我是三心${length + i}号`,          // 这里随便选一张图片就行          src: require("../../src/asset/images/sanxin.jpg").default,        });      }    },    // 使用节流,提高性能    doScroll: throttle(function () {      // 监听可视区域的滚动事件      // 公式:~~(滚动的距离 / 列表项 ),就能算出已经滚过了多少个列表项,也就能知道现在的startIndex是多少      // 例如我滚动条滚过了160px,那么index就是1,因为此时第一个列表项已经被滚上去了,可视区域里的第一项的索引是1      const index = ~~(this.$refs.scrollBox.scrollTop / this.itemHiehgt);      if (index === this.startIndex) return;      this.startIndex = index;      if (this.startIndex + this.itemNum > this.allSanxins.length - 1) {        this.getAllSanxin(30);      }    }, 200),    getScrollBoxHeight() {      // 获取可视区域的高度      this.boxHeight = this.$refs.scrollBox.clientHeight;    },  },  computed: {    itemNum() {      // 可视区域可展示多少个列表项? 计算公式:~~(可视化区域高度 / 列表项高度) + 2      // ~~是向下取整的运算符,等同于Math.floor(),为什么要 +2 ,是因为可能最上面和最下面的元素都只展示一部分      return ~~(this.boxHeight / this.itemHiehgt) + 2;    },    endIndex() {      // endIndex的计算公式:(开始索引 + 可视区域可展示多少个列表项 * 2)      // 比如可视区域可展示8个列表项,startIndex是0的话endIndex就是0 + 8 * 2 = 16,startIndex是1的话endIndex就是1 + 8 * 2 = 17,以此类推      // 为什么要乘2呢,因为这样的话可以预加载出一页的数据,防止滚动过快,出现暂时白屏现象      let index = this.startIndex + this.itemNum * 2;      if (!this.allSanxins[index]) {         // 到底的情况,比如startIndex是99995,那么endIndex本应该是99995 + 8 * 2 = 10011        // 但是列表数据总数只有10000条,此时就需要让endIndex = (列表数据长度 - 1)        index = this.allSanxins.length - 1;      }      return index;    },    tempSanxins() {      //   可视区域展示的截取数据,使用了数组的slice方法,不改变原数组又能截取      let startIndex = 0;      if (this.startIndex <= this.itemNum) {        startIndex = 0;      } else {        startIndex = this.startIndex + this.itemNum;      }      return this.allSanxins.slice(startIndex, this.endIndex + 1);    },    blankStyle() {      // 上下方的空白处使用padding来充当      let startIndex = 0;      if (this.startIndex <= this.itemNum) {        startIndex = 0;      } else {        startIndex = this.startIndex - this.itemNum;      }      return {        // 上方空白的高度计算公式:(开始index * 列表项高度)        // 比如你滚过了3个列表项,那么上方空白区高度就是3 * 150 = 450,这样才能假装10000个数据的滚动状态        paddingTop: startIndex * this.itemHiehgt + "px",         // 下方空白的高度计算公式:(总数据的个数 - 结束index - 1) * 列表项高度        // 例如现在结束index是100,那么下方空白高度就是:(10000 - 100 - 1) * 150 = 1,484,850        paddingBottom:          (this.allSanxins.length - this.endIndex - 1) * this.itemHiehgt + "px",          // 不要忘了加px哦      };    },  },};</script><style scoped>.v-scroll {  height: 100%;    overflow: auto;  .scroll-item {    height: 148px;        border: 1px solid black;    display: flex;    justify-content: space-between;    align-items: center;    padding: 0 20px;    img {      height: 100%;    }  }}</style>

“vue虚拟列表如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯