vue2 、 vue3首屏优化,减少白屏时间

在第一帧的时候加载应该被用户看到的页面部分,剩下的逐步加载

1.  使用v-for来模拟页面有很多重组件

<template v-for="item in 100">
            <sub-home-page :key="item" v-if="defer(item)"></sub-home-page>
        </template>

2.在created钩子中使用requestAnimationFrame对count进行赋值

let that = this
        function updataFrame() {
            that.count++;
            if(that.count >= this.components) return 
            that.reqId = requestAnimationFrame(updataFrame);
        }
        updataFrame();

3.使用计算属性,来控制组件是否渲染

defer(){
            return function(n){
                return this.count >= n;
            }
        }

4.在页面销毁的时候,取消requestAnimationFrame

destroyed(){
        cancelAnimationFrame(that.reqId)
    },

Vue3版本:

首页模拟100个重组件

<template>
    <div class="index">
        <div v-for="item in 100" :key="item">
            <sub-index v-if="defer(item)"></sub-index>
        </div>
    </div>
</template>

<script setup>
import subIndex from "./components/subIndex.vue";
import { useDefer } from "/src/utils/useDefer.js";
const defer = useDefer();
</script>

<style lang="less" scoped>
.index{
    width: 100%;
    height: 100%;
    overflow: auto;
    display: grid;
    grid-template-columns: repeat(3, fr);
    grid-gap: 0.1em;
}
</style>

 子组件(重组件)

<template>
    <div class="subHomePage">
        <div class="item" v-for="item in 5000" :key="item">
        </div>
    </div>
</template>

<script setup>

</script>
<style scoped lang="less">
.subHomePage{
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    border: 3px solid red;
    .item{
        width: 5px;
        height: 3px;
        background: #ccc;
        margin: 0.1em;
    }
}
</style>

 useDefer.js文件

import { ref, onUnmounted } from "vue";
export function useDefer(maxCount = 100){
    let count = ref(0);
    let reqId = null;
    function updataFrame() {
        count.value++;
        if(count.value >= maxCount) return 
        reqId = requestAnimationFrame(updataFrame);
    }
    updataFrame();

    onUnmounted(() => {
        cancelAnimationFrame(reqId)
    })

    return function (n){
        return count.value >= n;
    }
}

相关推荐

  1. vue2vue3优化减少时间

    2024-07-10 16:24:06       9 阅读
  2. webpack打包体积优化减少时间

    2024-07-10 16:24:06       42 阅读
  3. Vue加载优化

    2024-07-10 16:24:06       29 阅读
  4. vue次加载问题

    2024-07-10 16:24:06       45 阅读
  5. Vue.js 加载优化:实战与策略

    2024-07-10 16:24:06       5 阅读
  6. vue单页面应用(SPA)的加载速度优化

    2024-07-10 16:24:06       19 阅读

最近更新

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

    2024-07-10 16:24:06       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 16:24:06       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 16:24:06       4 阅读
  4. Python语言-面向对象

    2024-07-10 16:24:06       5 阅读

热门阅读

  1. 对于配置LLM,集显和独显的具体区别和影响

    2024-07-10 16:24:06       10 阅读
  2. Perl 语言入门学习

    2024-07-10 16:24:06       8 阅读
  3. 单例模式之静态内部类与枚举类

    2024-07-10 16:24:06       9 阅读
  4. 爬虫技术抓取网站数据

    2024-07-10 16:24:06       11 阅读
  5. [Go] 字符串遍历数据类型问题

    2024-07-10 16:24:06       9 阅读
  6. 51单片机第26步_单片机工作在空闲模式

    2024-07-10 16:24:06       8 阅读
  7. QT调节屏幕亮度

    2024-07-10 16:24:06       9 阅读
  8. Spring Boot手写starter

    2024-07-10 16:24:06       10 阅读
  9. 【国产开源可视化引擎Meta2d.js】视频

    2024-07-10 16:24:06       11 阅读