Vue2 - 延迟加载(requestAnimationFrame实现)+ 效果展示

1,背景

当一个页面需要加载较多个组件时,并且组件自身又比较复杂。如果一次性加载,可能等待时间较长,体验不好。

一种解决办法:分批次的来渲染子组件。

2,实现

通过 requestAnimationFrame(callback) 实现,同时能够控制按照指定顺序来渲染

简单理解为:浏览器会按照一定的频率来重绘页面,大概 60次/s。每次重绘前都会执行 callback 函数。这样的话,我们可以在每次重绘前都只渲染一个组件,来实现组件的延迟加载。

示例代码:

2.1,延迟加载的核心代码

通过 mixin 来实现。大致逻辑:

  1. 首先会传入一个最大重绘次数。
  2. 定义一个计数当前重绘次数的变量,每次调用 callback 时自增,重绘次数达到最大则结束 requestAnimationFrame 的执行。
  3. 定义一个方法,参数为指定的顺序,返回值用于判断组件是否展示。
    比如 v-if="deferItem(5)" 表示浏览器第5次重绘时渲染该组件。
export default function defer(maxFrameCount) {
   
  return {
   
    data() {
   
      return {
   
        frameCount: 0,
      };
    },
    mounted() {
   
      const refreshFrame = () => {
   
        requestAnimationFrame(() => {
   
          this.frameCount++;
          if (this.frameCount < maxFrameCount) {
   
            refreshFrame();
          }
        });
      };
      refreshFrame();
    },
    methods: {
   
      deferItem(showFrameCount) {
   
        return this.frameCount >= showFrameCount;
      },
    },
  };
}

2.2,模拟的复杂组件

子组件内部有 20000 个元素需要渲染,来模拟复杂的组件。

<template>
  <div class="container">
    <div v-for="n in 20000" class="item"></div>
  </div>
</template>

<script></script>
<style scoped>
.container {
     
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  width: 300px;
  height: 300px;
}

.item {
     
  width: 5px;
  height: 5px;
  background-color: #eee;
  margin: 0.1em;
}
</style>

2.3. 父组件

模拟渲染 25 个复杂子组件。

<template>
  <div class="container">
    <div v-for="n in 25" :key="n" class="wrapper">
      <HeavyComp v-if="deferItem(n)" />
    </div>
  </div>
</template>

<script>
import HeavyComp from "./components/HeavyComp.vue";
import defer from "./mixins/defer";
export default {
     
  components: {
     
    HeavyComp,
  },
  mixins: [defer(25)],
};
</script>
<style scoped>
.container {
     
  display: flex;
  flex-wrap: wrap;
}
.wrapper {
     
  border: 1px solid salmon;
}
</style>

3,效果

在这里插入图片描述


requestAnimationFrame 相关解释

以上。

相关推荐

  1. C#Lazy 实现延迟详解与示例

    2024-01-25 07:46:02       31 阅读
  2. vue实现滚动

    2024-01-25 07:46:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 07:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 07:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 07:46:02       82 阅读
  4. Python语言-面向对象

    2024-01-25 07:46:02       91 阅读

热门阅读

  1. MATLAB Fundamentals>>>Fill Missing Values

    2024-01-25 07:46:02       59 阅读
  2. 常用的gpt-4 prompt words收集6

    2024-01-25 07:46:02       41 阅读
  3. 嵌入式Linux:如何进行嵌入式Linux开发?

    2024-01-25 07:46:02       53 阅读
  4. ORACLE数据导出工具

    2024-01-25 07:46:02       45 阅读
  5. TestNG @AfterClass 注解

    2024-01-25 07:46:02       49 阅读
  6. wy的leetcode刷题记录_Day76

    2024-01-25 07:46:02       57 阅读
  7. Leetcode刷题(二十九)

    2024-01-25 07:46:02       59 阅读
  8. toggle封装

    2024-01-25 07:46:02       62 阅读
  9. SpringBoot-SpringBoot自动配置底层源码解析

    2024-01-25 07:46:02       44 阅读
  10. 使用django-admin来做erp,是否需要使用缓存数据库

    2024-01-25 07:46:02       57 阅读
  11. 数据结构练习3

    2024-01-25 07:46:02       47 阅读
  12. 江苏服务器租用要注意哪些方面?

    2024-01-25 07:46:02       55 阅读
  13. html 粒子效果文字特效

    2024-01-25 07:46:02       60 阅读