欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > vue2 、 vue3首屏优化,减少白屏时间

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

2025/1/5 14:23:36 来源:https://blog.csdn.net/m0_56104994/article/details/140302729  浏览:    关键词: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 = thisfunction 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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com