前端开发攻略---在页面上渲染大量元素,使用defer减少白屏等待时间,优化页面响应速度

news2025/1/9 16:18:55

1、优化前

2、优化后

 3、优化思路

1、在元素数量不变的情况下,进行一步一步的渲染,先渲染一些重要的元素或者需要用户第一时间看到的元素。

2、使用Hooks封装优化函数

4、优化代码

拥有大量元素的组件(Item):文件位置:components > Item > index.vue

<template>
  <div class="content">
    <span v-for="item in 5000">{{ item }},</span>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'
</script>

<style scoped lang="scss">
.content {
  padding: 10px;
  border: 1px solid red;
  display: flex;
  flex-wrap: wrap;
}
</style>

这里在App.vue组件中使用这个 Item 组件

<template>
  <div class="container">
    <div v-for="n in 100">
      <Item v-if="defer(n)"></Item>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import Item from '@/components/Item/index.vue'
import { useDefer } from '@/hooks/useDefer'

const defer = useDefer()
</script>

<style scoped lang="scss">
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 1em;
}
</style>

hooks文件:文件位置:hooks > useDefer.js

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

useDefer函数代码解释:

  1. import { ref, onUnmounted } from 'vue': 这里导入了 Vue 的 ref 和 onUnmounted 方法,用于创建响应式数据和在组件销毁时执行清理操作。

  2. export function useDefer(maxCount = 100) { ... }: 这是一个导出的函数,接受一个参数 maxCount,默认值为 100。这个参数用于设置最大的帧数,也就是最大的渲染延迟量。

  3. const frameCount = ref(1): 创建一个名为 frameCount 的响应式引用,用于追踪当前帧数。

  4. let rafId = null: 创建一个变量 rafId,用于存储 requestAnimationFrame 的返回值,以便后续取消渲染帧的请求。

  5. function updateFrameCount() { ... }: 这是一个内部函数,用于更新帧数。它使用 requestAnimationFrame 来递增 frameCount 的值,直到达到 maxCount

  6. updateFrameCount(): 调用 updateFrameCount 函数,开始更新帧数。

  7. onUnmounted(() => { ... }): 使用 onUnmounted 钩子,当组件被销毁时,取消 requestAnimationFrame

  8. return function (n) { ... }: 返回一个函数,这个函数接受一个参数 n,表示需要渲染的项目索引。在这个返回的函数中,它会检查当前帧数是否大于等于 n,如果是,则表示可以渲染该项目,否则需要延迟渲染。

总体来说,这段代码的作用是创建一个可以控制渲染延迟的函数,并在组件销毁时清理相关资源,这样可以有效地优化页面加载性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式系统中的嵌入式主板,你了解多少?

嵌入式主板&#xff0c;也称为嵌入式计算机主板&#xff0c;是一种专门设计用于嵌入式系统的计算机主板。与台式机和笔记本电脑中使用的常规主板不同&#xff0c;嵌入式主板设计用于集成到更大的电子设备中&#xff0c;例如汽车、医疗设备或自动售货机。在本文中&#xff0c;我…

C++ ─── 类和对象(构造函数和析构函数)

目录 1.类的6个默认成员函数 2. 构造函数&#xff08;对类进行 “初使化”&#xff09; 2.1 概念 2.2 特性 3.析构函数&#xff08;对类进行 “销毁”&#xff09; 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真…

stable diffusion基本原理

diffusion model latent diffusion &#xff1a;先对图片降维&#xff0c;然后在降维空间做diffusion&#xff1b;stable diffusion即基于此方法实现的&#xff0c;因此计算量很小&#xff1b; 共用降噪网络U-Net&#xff1a;输入noisy imagestep&#xff0c;告诉网络当前的噪声…

Redis入门到通关之Redis缓存数据实战

文章目录 ☃️什么是缓存?❄️❄️为什么要使用缓存❄️❄️如何使用缓存 ☃️缓存实战❄️❄️缓存模型和思路❄️❄️演示代码 ☃️缓存更新策略❄️❄️数据库缓存不一致解决方案 ☃️什么是缓存? 缓存就像自行车,越野车的避震器 举个栗子: 越野车,山地自行车,都拥有&qu…

5个常见的前端手写功能:New、call apply bind、防抖和节流、instanceof、ajax

实现New 首先创建一个新的空对象设置原型&#xff0c;将对象的原型设置为函数的prototype对象让函数的this指向这个对象&#xff0c;执行构造函数的代码判断函数的返回值类型&#xff0c;如果是值类型&#xff0c;返回创建的对象。如果是引用类型&#xff0c;就返回这个引用类…

四维轻云|如何使用场景在线协作功能?

众所周知&#xff0c;四维轻云是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑以及分享。平台有项目管理、数据上传、场景搭建、发布分享、素材库等功能模块。现在&#xff0c;就为大家介绍一下如何使用场景协作编辑功能。 1、协作模式开启…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时&#xff0c;为了支持我的工作&#xff0c;不妨给一个免费的⭐Star&#xff0c;这将是对我最大的鼓励&#xff01;感谢你的陪伴与支持&#xff01;一起在技术的路上共同成长吧&#xff01;点击链接&#xff1a;GitHub | G…

最新!!又5本On Hold无情被踢!!还剩11本期刊调查ing

【SciencePub学术】众所周知&#xff0c;期刊如果被打上“On Hold”的标签&#xff0c;就说明该期刊正在被进行调查评估&#xff0c;后面如果调查出期刊存在问题的话&#xff0c;则会被WOS期刊目录剔除&#xff01; 4.15号&#xff0c;科睿唯安官方更新了4月的SCI/SSCI期刊目录…

API数据应用场景电商运营选品API接口接入key获取演示

在电商运营中&#xff0c;API&#xff08;应用程序接口&#xff09;数据可以用于各种场景&#xff0c;特别是在选品过程中。以下是一些API数据应用场景&#xff0c;以帮助电商运营进行更有效的选品&#xff1a; 市场趋势分析&#xff1a;通过调用第三方数据提供商的API&#xf…

2023 中国 SDS 年度报告发布:XSKY 蝉联对象存储软件第一,整体 TOP5

近日&#xff0c;IDC 发布了《IDC China SDS Market Overview&#xff0c; 2023》市场报告&#xff0c;XSKY 星辰天合继续蝉联对象存储软件第一&#xff0c;文件存储保持领先地位&#xff0c;并且在中国市场整体 SDS 排名第五&#xff0c;也是 TOP5 里面唯一的专业 SDS 厂商。 …

力扣算法-回溯

递归 104.二叉树的最大深度 回溯 17.电话号码的字母组合 ①子集型回溯 78.子集 (1)选不选 (2)选哪个 131.分割回文串 &#xff08;1593.拆分字符串使唯一子字符串的数目最大 也可以用这个思路解&#xff1a;从结果角度&#xff0c;分割字符串&#xff09; ②组合型回溯…

Windows版MySQL5.7解压直用(免安装-绿色-项目打包直接使用)

windows下mysql分类 MySQL分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#xf…

EDMI电表光通讯口数采案例

【上海数采物联网科技有限公司】 工商业光伏发电并网项目 EDMI协议电表数采案例 项目背景及需求 项目地点&#xff1a;重庆港西光伏电站&#xff08;中广核重庆&#xff09; 项目背景&#xff1a;光伏发电并网项目电能监控 项目目的及难点&#xff1a;实现对EDMI协议电表…

毕设(五)——画pico扩展板

文章目录 一、扩展板原理图二、PCB三、3d预览 一、扩展板原理图 用pico作为主控&#xff0c;调用三个传感器&#xff0c;加上一个NB模块 排针间距差不多都是2.54&#xff08;只要能插在洞洞板或者面包板&#xff09;使用网络标签&#xff0c;对端口进行命名&#xff0c;相同…

终于看到一个不在 Backbone上研究 ReNet的了!直接优化小目标检测性能,不卷ImageNet-1K数据集!

终于看到一个不在 Backbone上研究 ResNet的了&#xff01;直接优化小目标检测性能&#xff0c;不卷ImageNet-1K数据集&#xff01; 前言 传统的基于深度学习的目标检测网络在数据预处理阶段常通过调整图像大小以达到特征图中的统一尺寸和尺度。调整大小的目的是为了便于模型传播…

1W 3KVDC 隔离 单输出 DC/DC 电源模块——TPB-1W 系列

TPB-1W系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳…

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…

Vue.extend()和我的两米大砍刀

Vue.extends是什么&#xff1f; 一个全局API,用于注册并挂载组件。 传统的引用组件的方式是使用import直接引入&#xff0c;但是使用Vue.extends()也可以实现。 使用规则 <div id"mount-point"></div>// 创建构造器 var Profile Vue.extend({templat…

4.16

1.总结keil5下载代码和编译代码需要注意的事项 1.&#xff09;仿真器设置&#xff1a; 点击魔术棒&#xff0c;选择debug选项&#xff0c;找到使用的仿真器&#xff0c;选择ST-LINK仿真器&#xff0c;点击setting&#xff0c;选择flash download ,勾选reset and run,选择pack…

SpringBoot整合Nacos

文章目录 nacosnacos下载nacos启动nacos相关配置demo-dev.yamldemo-test.yamluser.yaml 代码pom.xmlUserConfigBeanAutoRefreshConfigExampleValueAnnotationExampleDemoApplicationbootstrap.yml测试结果补充.刷新静态配置 nacos nacos下载 下载地址 一键傻瓜试安装即可,官…