前端优化、虚拟列表(长数据加载)

153 阅读1分钟

有时候在项目中出现成千万条数据, 然而没有分页功能, 这个时候把数据直接渲染就会造成页面卡顿, 这个时候我们就可以做下优化, 下面是针对固定高度的简单的长列表进行优化:

思路:只渲染可视区,根据滚动来渲染下一页的数据

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <style>
      #box {
        border: 1px solid;
        overflow-y: scroll;
      }
      .inside {
        position: absolute;
      }
      .item {
        height: 30px;
      }
    </style>
    <div id="box" ref="box">
      <div class="outside" ref="outside">
        <div class="inside">
          <div class="item" v-for="(v,i) in tempArr" :key="i">
            {{'内容: ' + v }}
          </div>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script>
      new Vue({
        el: "#box",
        data: {
          arr: [],
          tempArr: [],
          pageSize: 10,
          size: 30, //高度为30px
        },
        created: function () {
          for (let i = 1; i <= 100000; i++) {
            this.arr.push(i);
          }
          document.getElementById("box").style.height =
            this.pageSize * this.size + "px";
          document.getElementsByClassName("outside")[0].style.height =
            this.arr.length * this.size + "px";
          this.tempArr = this.arr.slice(0, this.pageSize);
        },
        mounted: function () {
          let boxEl = document.getElementById("box");
          boxEl.addEventListener("scroll", this.scrollFun, false);
        },
        methods: {
          scrollFun() {
            let scrollTop = document.getElementById("box").scrollTop;
            console.info(scrollTop);
            // 根据滚动动态计算数据
            let start = Math.floor(scrollTop / this.size);
            let end = start + this.pageSize;
            this.tempArr = this.arr.slice(start, end);
          }
        },
      });
    </script>
  </body>
</html>