前端大数据渲染:虚拟列表、触底加载与分堆渲染方案 针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿下面总结常见的几种大数据渲染方案。
来源:存储技术社区 发布日期:2024-10-31
针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿下面总结常见的几种大数据渲染方案
虚拟列表渲染
用虚拟列表的手段,即先对设置的可见区域内的数据进行演染,然后计算出鼠标滚动距离大约是滚动了多少项,通过动态的设置距离顶部的top值达到可见区域动态染数据不会卡顿的效果
class="virtualListWrap"
ref="virtualListWrap"
:style="{ height: itemHeight * count + 'px' }"
@scroll="handleScroll"
class="placeholderDom"
:style="{ height: allListData.length * itemHeight + 'px' }"
v-for="(item, index) in showListData"
:key="index"
class="itemClass"
:style="{ height: itemHeight + 'px' }"
{{ item.name }}
loading...
import { ref, computed, onMounted } from 'vue';
import axios from "axios";
const allListData = ref([]); // 存储所有数据的数组
const itemHeight = 40; // 每个列表项的高度(像素)
const count = 10; // 一次显示的数据项数量
const start = ref(0); // 当前可见区域的起始索引
const end = ref(10); // 当前可见区域的结束索引
const topVal = ref('0px'); // 内容区域的顶部偏移量
const loading = ref(false); // 控制加载提示的显示
const virtualListWrap = ref(null);
// 计算当前应该显示的数据
const showListData = computed(() => {
return allListData.value.slice(start.value, end.value);
loading.value = true;
const res = await axios.get("http://124.223.69.156:3300/bigData");
allListData.value = res.data.data;
loading.value = false;
分堆渲染
通过将数据分成小块,只有当前可视区域的数据会被加载,这样避免了由于一次性加载大量数据而引发的性能瓶颈,从而减少了初始渲染时间,让用户可以快速看到界面。其次,分堆渲染有效降低了内存占用,因为系统只需保持当前可视部分的数据在内存中,尤其在处理大规模数据时,这种策略能显著提升应用的流畅度,防止因内存不足导致的崩溃或卡顿现象。此外,用户体验得到了极大的改善,用户在滚动或翻页时,新数据可以无缝加载,避免了传统分页方式中需要等待新页面加载的尴尬,让用户的操作更加自然和顺畅。 把大数据一维数组通过while循环变成二维数组,然后借助requestanimationframeAPI对二维数组里面的每一堆进行分堆染达到染数据不卡顿的效果
style="margin-bottom: 12px"
size="small"
type="primary"
:loading="loading"
@click="plan"
>点击请求加载
height="300"
:data="arr"
border
style="width: 80%"
:header-cell-style="{
height: '24px',
lineHeight: '24px',
color: '#606266',
background: '#F5F5F5',
fontWeight: 'bold',
}"
import { ref } from 'vue';
import axios from "axios";
const arr = ref([]);
const loading = ref(false);
const averageFn = (arr) => {
let i = 0;
let res = [];
while (i < arr.length) {
res.push(arr.slice(i, i + 10));
i = i + 10;
return res;
loading.value = true;
const res = await axios.get('http://124.223.69.156:3300/bigData');
loading.value = false;
const resArr = averageFn(res.data.data);
触底加载
无缝的交互方式让他们感觉更加自然,能够持续浏览内容。其次,触底加载能够有效管理数据的加载量,系统只在用户即将到达页面底部时才渲染新的数据,提高了加载速度
v-el-table-infinite-scroll="load"
height="480"
:data="tableData"
border
style="width: 80%"
v-loading="loading"
element-loading-text="稍后..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(255, 255, 255, 0.5)"
:header-cell-style="{
height: '24px',
lineHeight: '24px',
color: '#606266',
background: '#F5F5F5',
fontWeight: 'bold',
}"
KKKKKKKKKKKKKKKKKK
import { ref, onMounted } from 'vue';
import axios from "axios";
result.push(arr.slice(i, i + 10)); // 一次截取10个用于分堆
KKKKKKKKKKKKKK
i = i + 10; // 这10个截取完,再准备截取下10个
return result;
KKKKKKKKKKKK
const allTableData = ref([]);
const tableData = ref([]);
const loading = ref(false);
// 第一步,请求大量数据时候,转成二维数组,分堆分组分KKKKKKKKKK块存储
onMounted(async () => {
loading.value = true;
const res = await axios.get("http://124.223.69.156:3300/bigData");
KKKKKKKKallTableData.value = averageFn(res.data.data);
// 也可以存一份原始值,留作备用,都行的
// const originalAllTableData = allTableData.value;
loading.value = false;
load();
KKKKKK
const load = async () => {
// console.log("自动多次执行之,首次执行会根据高度去计算要执行几次合适");
//KKKK 第四步,触底加载相当于把二维数组的每一项取出来用,用完时return停止即可
if (allTableData.value.length == 0) {
console.log("没数据啦");
return;
// 第二步,加载的时候,把二维数组的第一项取出来,拼接到要展示的表格数据中去
let arr = allTableData.value[0];
tableData.value = tableData.value.concat(arr);
// console.log(tableData.value);
// 第三步,拼接展示以后,再把二维数组的第一项的数据删除即可
allTableData.value.shift();
本篇文章到这里就结束了,如果对你有所帮助就点个赞吧 会持续更新技术文章
合理的分区和分桶策略在 Apache Doris 中至关重要。通过选择合适的分区列和分桶列,合理设置分区范围和桶数,充分利用分区裁剪和并行查询技术,可以显著提升查询性能和数据管理效率。根据实际业务场景和数据特点,动态调整分区和分桶策略是优化的重要环节。
前端大数据量渲染处理方式,虚拟列表不会一次性将所有数据都渲染到页面中,而是只渲染可视区域的内容,当鼠标滚动时,再渲染下一波内容,即虚拟列表中的dom元素始终是指定数目的。当从后端一次性取到成千条数据进行页面渲染,再对页面进行操作很可能导致页面崩溃,这时就可以用虚拟列表的方法,进行页面的渲染。
参考文献https://juejin.im/entry/5aaf66f56fb9a028c71e403e
由于业务需要,当大批量的dom(10W个场景)展现在table中,会导致滚动条卡顿,因此需要开发一个虚拟列表的功能
原理:根据grid的高度,计算展现条数,通过css属性,transform中的translate(x,y)方法实现,将数据先保存至js的变量中,每次计算以后,slice数组中...
虚拟列表其实是按需显示的一种实现,即只对可见区域进行渲染,对非可见区域中的数据不渲染或部分渲染的技术,从而达到极高的渲染性能。来看一下渲染的效果吧4888/[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZsUnzSX-1658297325037)(https4536000.image?)]一个虚拟列表一共分为上空白区、上缓冲区、可视区、下缓冲区、下空白区,废话不多说,直接上图这是页面发生滚动之后渲染的样子。...
前端虚拟滚动列表 vue虚拟列表。在大型的企业级项目中经常要渲染大量的数据,这种长列表是一个很普遍的场景,当列表内容越来越多就会导致页面滑动卡顿、白屏、数据渲染较慢的问题;大数据量列表性能优化,减少真实dom的渲染看图:绿色是显示区域,绿色和蓝色中间属于预加载:解决滚动闪屏问题;大致了解了流程在往下看;
虚拟列表就是通过几个列表项将无数数据一次以列表形式展现出来在这里我通过设置一个容器的高度将主要容器撑起来,它的高度由单个列表项高度乘以数据长度得来;撑起主要容器的作用主要是模拟普通列表的滚动条主要容器滚动时,下移列表,使得列表一直在视窗内;具体的距离计算方法和列表项内容更新方法在代码里有,也就一句代码,这是我目前能找到和想到的简单的方法............
虚拟列表只渲染当前视口可见部分的数据,大大减少了渲染的节点数量,提高了页面的性能和响应速度。动态数据更新:对于实时更新的数据,虚拟列表能够更高效地处理数据的添加、删除和修改,只更新可见区域的数据,避免了对整个列表的重新渲染。适应不同设备和网络环境:无论是在低性能设备上还是在网络条件较差的情况下,虚拟列表都能够保证页面的基本可用性和较好的性能。例如,一个包含数万条记录的列表,如果全部渲染,可能会使浏览器内存占用过高,而虚拟列表只渲染当前能看到的几十条。
假设后端返回 1000 条数据,前端一次性展示出来,可能用户只想看到前 100 条,那么剩下 90% 的数据就没必要展示了。因为我们实际上只展示一个视口能看到的元素,所以实际上页面是不会有很大的滚动条(或者没有滚动条)的,所以这里需要一个撑起页面高度的元素,这个元素的高度为。另外在无限滚动的页面中,也可能会有大量的数据存在前端展示,随着滚动深度加深,展示的数据也越来越多,就可能造成上面提到的性能问题。只考虑了最基本的情况:元素高度是固定的,一般用来展示图片之类的。,我们要展示的元素则是通过。
圆形煤场挡煤墙施工方案一、工程概况圆形煤场挡煤墙施工方案是热电新建工程主体施工项目 C 标段的一部分,主要目的是在热电项目中储存原煤。整个圆形煤场内有中心柱、事故煤斗等,通过 4#廊道与 2#转运站连接。 ...
处理大量数据的渲染对于前端开发来说是一项挑战,但也是提升网页性能和用户体验的重要环节。要有效解决这一问题,可以采用虚拟滚动(Virtual Scrolling)、分批渲染(Incremental Rendering)、使用Web Workers处理数据、利用前端分页(Pagination)、借助服务端渲染(SSR)来优化大量数据的处理。其中,虚拟滚动是一种非常有效的技术,它通过只渲染用户可见的列表项来极大减少DOM操作和提高性能。这种方式不仅提升了滚动的流畅度,也减轻了浏览器的负担,尤其适用于长列表数据的展
首先先创建一个div容器,给它添加样式代码,超出部分以滚动条形式出现。然后我们在这个div容器里面,创建两个同级的div,一个名为bar的div用来撑起来高度,因为我们后面要滚动盒子,高度必须撑开;另一个名为list,存放item项,这个list不需要设置高度,但要设置相对定位,因为这个主要思路就是靠bar把高度撑开,然后给list定位脱离文档流,直接定位在可视区域,每次滚动的时候就修改list的top值就可以实现效果。我们通过css样式代码,隐藏滚动条,效果更加不错。
推荐一款高效轻量级的虚拟列表组件 —— Preact-Virtual-List
preact-virtual-list:card_index: Virtual List that only renders visible items. Supports millions of rows.项目地址:https://gitcode.com/gh_mirrors/pr/preact-virtual-l...
码农小筑:
这篇文章详细介绍了vue3大屏可视化项目的构建,从全局概览到具体实现,包括全屏适配、自定义色彩方案和高级地图应用。头部设计与项目请求、环境配置的细节分享也很实用,对正在开发类似项目的开发者很有帮助。
芝士码匠(Geek Coder):
文章分享了Vue3大屏可视化项目设计,涵盖全屏适配、地图和图表。详细解析了全屏方案,包括组件宽高计算。还提供了项目头和环境搭建代码,对做类似项目有参考价值,值得学习。
CSDN-Ada助手:
不知道 算法 技能树是否可以帮到你:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm