当前位置: 首页 > news >正文

分段渲染加载页面

前言

在日常工作中我们一定会遇到某个页面需要渲染比较多的内容,比如列表或者文字;一般当数据过多的时候,就会出现页面加载比较慢,很长时间没有内容的展示,用户体验不太好,当然这时候就有人会说直接使用虚拟滚动嘛,只展示其中一部分数据。这种确实是一个非常好的办法,但是如果页面可能不能使用虚拟滚动实现呢(虽然少,但是有可能),此时我们就需要实现分段渲染

一、分段渲染是什么?

分段渲染就是每次只渲染一部分数据,比如我有1w条数据,我每次只渲染其中10条或者20条数据。

二、实现

1.不使用分段渲染

首先我们先看一下不使用分段渲染,直接渲染全部数据是什么样子的,我们先降低浏览器的CPU,模拟低配置的运行方式
在这里插入图片描述
这里我们使用推荐的

<template><div><ul><li v-for="item in total" :key="item.id" style="margin-top: 10px"><div>显示其他内容</div>{{ item.name }}</li></ul></div>
</template>
<script setup lang="ts">
import { ref } from "vue";
const observer = new PerformanceObserver((list) => {console.log(list);const entries = list.getEntriesByName("first-paint");if (entries.length > 0) {const fcpTime = entries[0].startTime;console.log("First Contentful Paint:", fcpTime, "ms");observer.disconnect(); // 获取到数据后断开观察器}
});observer.observe({ type: "paint", buffered: true });
const total = ref([]);
// 造1000条数据
const startTime = performance.now();
for (let i = 0; i < 10000; i++) {total.value.push({id: i,name: `name${i}`,age: 18 + i,});
}
const endTime = performance.now();
console.log(`数据生成,耗时:${endTime - startTime}ms`);

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

我们能看到,FCP的时间高达1000+ms,每次刷新有偏差,但是基本都是1000+的

2 使用分段渲染

<template><div><ul><li v-for="item in list" :key="item.id" style="margin-top: 10px"><div>显示其他内容</div>{{ item.name }}</li></ul></div>
</template>
<script setup lang="ts">
import { ref } from "vue";
const observer = new PerformanceObserver((list) => {const entries = list.getEntriesByName("first-paint");if (entries.length > 0) {const fcpTime = entries[0].startTime;console.log("First Contentful Paint:", fcpTime, "ms");observer.disconnect(); // 获取到数据后断开观察器}
});observer.observe({ type: "paint", buffered: true });
const total = ref([]);
// 造1000条数据
const startTime = performance.now();
for (let i = 0; i < 10000; i++) {total.value.push({id: i,name: `name${i}`,age: 18 + i,});
}
const endTime = performance.now();
console.log(`数据生成,耗时:${endTime - startTime}ms`);
const list = ref([]);
// 使用requestAnimationFrame分批次渲染
const renderBatch = () => {const batchSize = 100;const totalItems = total.value.length;let startIndex = 0;const renderNextBatch = () => {const endIndex = startIndex + batchSize;const batchItems = total.value.slice(startIndex, endIndex);list.value.push(...batchItems);startIndex = endIndex;if (startIndex < totalItems) {requestAnimationFrame(renderNextBatch);}};renderNextBatch();
};
renderBatch();

这里使用requestAnimationFrame进行渲染,如果不清楚的可自行查阅mdn文档
此时我们看看结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时结果最大1088ms,也能看出来提升较为明显;
不过会出现滚动条会一直变小,因为不断在渲染加载新的数据,当然这也不算什么大问题;
当然也不一定非得用requestAnimationFrame,用延时器也是一样的,目的都是为了每次只加载一部分数据

总结

以上就是关于通过使用分段渲染来达到快速加载数据的方法,当然,这种方式并不是最好的,因为真正涉及到大数据列表还是虚拟滚动的性能和效果最好。

http://www.xdnf.cn/news/1346275.html

相关文章:

  • 【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
  • 浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
  • STM32F1 EXTI介绍及应用
  • 光耦合器:电子世界的 “光桥梁“
  • ZYNQ启动流程——ZYNQ学习笔记11
  • X00238-非GNSS无人机RGB图像卫星图像视觉定位python
  • 25年8月通信基础知识补充1:中断概率与遍历容量、Sionna通信系统开源库、各种时延区分
  • Android 16环境开发的一些记录
  • Prometheus+Grafana监控redis
  • 制造企业用档案宝,档案清晰可查
  • 81 柔性数组造成的一些奇怪情况
  • 农业-学习记录
  • 关于 WebDriver Manager (自动管理浏览器驱动)
  • 当下一次攻击发生前:微隔离如何守护高敏数据,防范勒索攻击下的数据泄露风险!
  • 一、Python IDLE安装(python官网下的环境安装)
  • 腾讯云EdgeOne安全防护:快速上手,全面抵御Web攻击
  • Datawhale AI夏令营---coze空间共学
  • 【图像算法 - 21】慧眼识虫:基于深度学习与OpenCV的农田害虫智能识别系统
  • 关于日本服务器的三种线路讲解
  • 在自动驾驶中ESKF实现GINS时,是否将重力g作为变量考虑进去的目的是什么?
  • ASPICE过程能力确定——度量框架
  • Unity--判断一个点是否在扇形区域里面(点乘和叉乘的应用)
  • 视觉语言大模型应用开发——基于 CLIP、Gemini 与 Qwen2.5-VL 的视频理解内容审核全流程实现
  • ref 简单讲解
  • flutter geolocator Android国内定位失败问题解决
  • JVM 调优全流程案例:从频繁 Full GC 到百万 QPS 的实战蜕变
  • 【大模型本地运行与部署框架】Ollama的cmd常用命令
  • Linux 软件编程(九)网络编程:IP、端口与 UDP 套接字
  • 【Python】两条命令永久切国内源
  • 本地组策略编辑器图形化工具