Vue3——首屏加载速度过慢解决方案

requestAnimationFrame和cancelAnimationFrame

requestAnimationFrame

与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次

cancelAnimationFrame

取消一个先前通过调用window.requestAnimationFrame()方法添加到计划中的动画帧请求。

这里需要注意下兼容性:

在这里插入图片描述

import {ref,onUnmounted} from 'vue';
export function useDefer(maxCount = 100){
    const frameCount = ref(0);
    let rafId;
    function updateFrameCount(){
        rafId=requestAnimationFrame(()=>{
            frameCount.value ++;
            if (frameCount.value >= maxCount) {
                return;
            }
            updateFrameCount()
        })
    }
    updateFrameCount()
    onUnmounted(() => {
      cancelAnimationFrame(rafId)  
    })
    return function defer(n) {
        return frameCount.value >= n;
    }
}

用于实现一个延迟函数。具体来说,它使用了Vue 3中的ref和onUnmounted函数,以及JavaScript中的requestAnimationFrame和cancelAnimationFrame函数。
函数接受一个maxCount参数,用于指定最大的帧数。在函数内部,创建了一个frameCount ref对象,并定义了一个updateFrameCount函数,用于递增frameCount的值,并在达到maxCount时停止递增。updateFrameCount函数使用requestAnimationFrame函数来实现帧数的递增,并在达到maxCount时停止递增。

最后,函数返回一个defer函数,用于检查当前帧数是否达到指定的值n。如果达到了,defer函数返回true,否则返回false。在组件中使用defer函数可以实现一些需要延迟执行的操作,例如我们这里可以用到的首屏加载速度优化。同时,因为这里是使用了onUnmounted函数,可以确保在组件销毁时停止帧数的递增,也能避免内存泄漏和性能问题。
使用方法:我可以将此方法放入初始启动的页面中,例如登录(如果页面速度快的话可以不用,我这里是因为登录页面特效较多)

// 首屏优化处理方案
import {useDefer} from '@/utils/useDefer';
const defer = useDefer()
 <el-form ref="loginFormRef" v-if="defer(1)" :model="ruleForm" label-width="auto" :rules="rules">
	<el-form-item label="用户名" prop="username">
		<el-input v-model="ruleForm.username" clearable placeholder="请输入用户名" />
	</el-form-item>
	<el-form-item label="密码" prop="password">
		<el-input v-model="ruleForm.password" show-password placeholder="请输入密码" />
	</el-form-item>
	<el-row class="flex-button">
		<el-button plain type="primary" :loading="isLoading" @click="submitForm(loginFormRef)">登录</el-button>
		<el-button plain type="success" @click="resetForm(loginFormRef)">重置</el-button>
	</el-row>
</el-form>
<div class="svg" v-if="defer(2)"></div>
<div class="svg" v-if="defer(3)"></div>
<div class="svg" v-if="defer(4)"></div>
<div class="svg" v-if="defer(5)"></div>
<div class="svg" v-if="defer(6)"></div>
...
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3中实现首屏加载动画,你可以参考以下步骤: 1. 首先,在你的Vue项目中创建一个全局加载组件,用于展示加载动画。你可以在组件中使用CSS或动画库来定义你想要的加载效果。 2. 在你的根组件(通常是App.vue)中引入并注册这个全局加载组件。 3. 在页面加载的过程中,使用Vue的生命周期钩子函数(如created或mounted)来控制加载动画的显示和隐藏。在页面加载之前,显示加载动画;加载完成后,隐藏加载动画。 4. 如果你想要自定义加载动画的样式,你可以在全局加载组件中定义样式,并在组件中使用<slot>标签来插入内容。 5. 最后,你可以根据你的需求在加载动画组件中添加文本或图标来显示加载状态,以提供更好的用户体验。 请注意,加载动画和数据请求的组件不应同时使用,以免出现两个加载效果。另外,要谨慎使用全局加载动画,因为它会在整个应用程序中显示。 这是一个简单的示例代码,展示了如何在Vue3中实现首屏加载动画: ```vue // 在全局加载组件中定义加载动画的样式和内容 <template> <div class="loading"> <div class="loader"></div> <p>Loading...</p> </div> </template> <script> export default { name: 'Loading', // 根据需要可以添加进入、离开过渡效果 // 可以使用CSS或动画库定义加载动画的样式 // 在created或mounted钩子函数中控制显示和隐藏 created() { // 显示加载动画 }, mounted() { // 隐藏加载动画 } } </script> // 在根组件中引入并注册全局加载组件 <template> <div id="app"> <router-view /> <Loading v-if="isLoading" /> </div> </template> <script> import Loading from '@/components/Loading.vue'; export default { name: 'App', components: { Loading }, data() { return { isLoading: true } }, created() { // 页面加载前显示加载动画 }, mounted() { // 页面加载完成后隐藏加载动画 } } </script> ``` 这样,当你的Vue应用程序加载时,首屏将会显示加载动画,加载完成后加载动画将会被隐藏。你可以根据自己的需求自定义加载动画的样式和内容。记得根据实际情况在合适的生命周期钩子函数中控制加载动画的显示和隐藏。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue实现页面加载动画效果](https://download.csdn.net/download/weixin_38721565/12772582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue实现网页首屏加载动画、页面内请求数据加载loading](https://blog.csdn.net/weixin_48337566/article/details/127896990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Southern Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值